ZMQ消息传递特定端点

本文关键字:端点 消息传递 ZMQ | 更新日期: 2023-09-27 18:12:32

我目前使用ZMQ作为我在c#服务器和多个c++客户端之间发送信息的手段。由于不同语言之间的标准协议,ZMQ到目前为止工作得很好。

但是现在随着我的协议的发展,我在使用ZMQ时遇到了瓶颈。我的协议要求我知道我当前正在与哪个端点通话,以便我可以将正确的RSA密钥应用于发送的消息。

对我需要做的事情做一个简要的概述可能会有帮助。我使用REQ和REP套接字。客户端使用REQ套接字,服务器使用REP套接字。
  1. 每个客户端通过socket.connect()通过tcp连接到服务器,并发送一个快速请求让服务器知道它在那里。
  2. 服务器通过每秒轮询套接字并引发receiveReady事件来接收请求。服务器通过字符串发送命令,通知客户端生成私钥/公钥。
  3. 客户端这样做,然后通过字符串再次将公钥发送到服务器。一旦服务器获得密钥,它将创建一个Client对象,该对象将密钥和套接字存储到该客户端。(这是协议失效的地方)
  4. 当服务器需要向客户端发送信息时,它循环遍历客户端对象并加密并将消息发送给正确的接收者。

我假设SocketEventArgs中的Socket返回一个套接字到引发事件的端点。(类似于在非zmq c#中接受连接)这似乎是错误的。SocketEventArgs中的套接字似乎是所有客户端连接到的"全局"套接字。因此,当客户端连接时,我最终失去了对套接字的跟踪。

所以我的问题是,我如何使它工作?如果可能的话,我希望保留ZMQ,因为它非常好用,并为我解决了许多小的边缘情况。如果不可能,是否有另一个类似于ZMQ的框架允许我引用特定的端点?

顺便说一下,我使用的是ZMQ当前的稳定版本3.2.3,以及c#的clrzmq。

编辑:考虑到这一点,一个解决方案可能是在每条消息前加上一个字符串来标识套接字。因为当前的实现只对流向下游的客户端的信息进行加密。虽然这让我很担心,因为有数据包嗅探器的人可能很容易冒充另一个客户机。

EDIT2:这个stackoverflow问题类似于我的确定ZMQ消息的来源?并且支持我必须以某种方式识别我发送到服务器的每条消息的概念。但对于我的具体情况,我不关心IP地址或诸如此类的东西。我只是希望能够存储端点,以便以后可以与它们通信。它开始看起来像这将是不可能与ZMQ。

这听起来合理吗?

  1. 每个客户端连接到服务器,并发送一个快速请求,让服务器知道它在那里。请求在第一帧中包含一个唯一的id。
  2. 服务器确认请求并通知客户端生成私钥/公钥。
  3. 客户端这样做,然后发送公钥到服务器。
  4. 一旦服务器获得密钥,它创建一个Client对象,该对象存储密钥和客户端的唯一id。
  5. 客户端每隔几秒就向服务器轮询新信息。
  6. 每当服务器有新信息要发送时,它等待客户端轮询服务器,然后在套接字上回复该客户端。(这就是我现在担心的。我如何确保当每个客户端连接到的"全局"套接字收到消息时,我发送的下一条消息将发送到同一端点?)
我真不敢相信我忘了输入我的套接字类型。我目前正在使用REQ-REP模式,其中每个客户端都是套接字类型REQ,服务器是REP套接字。服务器绑定到一个端口,客户端直接连接到该端口。所有这些都是通过tcp完成的,因为客户端可以在世界上的任何地方。

EDIT4:我已经用一些更具体的细节更新了原始实现。

ZMQ消息传递特定端点

使用问题评论中描述的ROUTER-DEALER模式