我目前正在使用ZMQ作为在C#服务器和多个C ++客户端之间发送信息的方法。由于不同语言之间的标准协议,ZMQ已经完美地完成了这一点。
但是现在我的协议已经发展,我正在与ZMQ陷入困境。我的协议要求我知道我正在与哪个端点通话,以便我可以将正确的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套接字。服务器绑定到端口,客户端直接连接到它。所有这一切都是通过tcp完成的,因为客户端可以在世界上的任何地方。
EDIT4:我已经用更具体的内容更新了原始实现。
答案 0 :(得分:2)
使用ROUTER-DEALER模式,如问题评论中所述。