我目前正在使用ZMQ作为在C#服务器和多个C++客户端之间发送信息的方式。到目前为止,由于不同语言之间的标准协议(protocol),ZMQ已经完美地工作了。
但是现在随着我的协议(protocol)的发展,我正与ZMQ碰壁。我的协议(protocol)要求我知道当前正在与哪个端点进行通讯,以便可以对发送的消息应用正确的RSA密钥。
简要概述我需要做的事情可能会有所帮助。我正在使用REQ和REP套接字。客户端使用REQ套接字,服务器使用REP套接字。
我假设SocketEventArgs中的Socket返回了一个引发事件的端点的套接字。 (类似于在非ZMQ C#中接受连接)这似乎是错误的。 SocketEventArgs中的套接字似乎是所有客户端都连接到的“全局”套接字。因此,当客户端连接时,我最终失去了对套接字的跟踪。
所以我的问题是,我该如何进行这项工作?如果可能的话,我希望保留ZMQ,因为使用它非常好,可以为我解决许多小问题。如果不可能,是否有与ZMQ相似的框架允许我引用特定的端点?
顺便说一句,我使用的是ZMQ的当前稳定版本3.2.3,以及用于C#的clrzmq。
编辑:考虑一下,一种解决方案可能是在每个消息之前添加一个字符串以标识套接字。由于当前的实现方式仅对下行到客户端的信息进行加密。尽管这让我感到担忧,但作为一个具有数据包嗅探器的人可能能够相当轻松地模拟另一个客户端。
EDIT2:这个stackoverflow问题类似于我的Identifying the origin of ZMQ messages?,并支持我必须以某种方式标识发送到服务器的每条消息的概念。但是对于我的具体情况,我不在乎IP地址或类似的东西。我只希望能够存储端点,以便以后再与他们交谈。似乎开始无法使用ZMQ实现。
听起来合理吗?
EDIT3:我不敢相信我忘记输入套接字类型。我当前正在使用REQ-REP模式,其中每个客户端的套接字类型为REQ,服务器为REP套接字。服务器绑定(bind)到端口,客户端直接连接到该端口。所有这些都是通过tcp完成的,因为客户端可以位于世界任何地方。
EDIT4:我已经用一些更详细的内容更新了原始实现。
最佳答案
使用问题注释中所述的ROUTER-DEALER模式。
关于c# - ZMQ消息传递特定端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16403969/