ZMQ消息传递特定端点
ZMQ messaging specific endpoints
我目前使用ZMQ作为我在c#服务器和多个c++客户端之间发送信息的手段。由于不同语言之间的标准协议,ZMQ到目前为止工作得很好。
但是现在随着我的协议的发展,我在使用ZMQ时遇到了瓶颈。我的协议要求我知道我当前正在与哪个端点通话,以便我可以将正确的RSA密钥应用于发送的消息。
对我需要做的事情做一个简要的概述可能会有帮助。我使用REQ和REP套接字。客户端使用REQ套接字,服务器使用REP套接字。- 每个客户端通过socket.connect()通过tcp连接到服务器,并发送一个快速请求让服务器知道它在那里。
- 服务器通过每秒轮询套接字并引发receiveReady事件来接收请求。服务器通过字符串发送命令,通知客户端生成私钥/公钥。
- 客户端这样做,然后通过字符串再次将公钥发送到服务器。一旦服务器获得密钥,它将创建一个Client对象,该对象将密钥和套接字存储到该客户端。(这是协议失效的地方)
- 当服务器需要向客户端发送信息时,它循环遍历客户端对象并加密并将消息发送给正确的接收者。
我假设SocketEventArgs中的Socket返回一个套接字到引发事件的端点。(类似于在非zmq c#中接受连接)这似乎是错误的。SocketEventArgs中的套接字似乎是所有客户端连接到的"全局"套接字。因此,当客户端连接时,我最终失去了对套接字的跟踪。
所以我的问题是,我如何使它工作?如果可能的话,我希望保留ZMQ,因为它非常好用,并为我解决了许多小的边缘情况。如果不可能,是否有另一个类似于ZMQ的框架允许我引用特定的端点?
顺便说一下,我使用的是ZMQ当前的稳定版本3.2.3,以及c#的clrzmq。
编辑:考虑到这一点,一个解决方案可能是在每条消息前加上一个字符串来标识套接字。因为当前的实现只对流向下游的客户端的信息进行加密。虽然这让我很担心,因为有数据包嗅探器的人可能很容易冒充另一个客户机。EDIT2:这个stackoverflow问题类似于我的确定ZMQ消息的来源?并且支持我必须以某种方式识别我发送到服务器的每条消息的概念。但对于我的具体情况,我不关心IP地址或诸如此类的东西。我只是希望能够存储端点,以便以后可以与它们通信。它开始看起来像这将是不可能与ZMQ。
这听起来合理吗?
- 每个客户端连接到服务器,并发送一个快速请求,让服务器知道它在那里。请求在第一帧中包含一个唯一的id。
- 服务器确认请求并通知客户端生成私钥/公钥。
- 客户端这样做,然后发送公钥到服务器。
- 一旦服务器获得密钥,它创建一个Client对象,该对象存储密钥和客户端的唯一id。
- 客户端每隔几秒就向服务器轮询新信息。
- 每当服务器有新信息要发送时,它等待客户端轮询服务器,然后在套接字上回复该客户端。(这就是我现在担心的。我如何确保当每个客户端连接到的"全局"套接字收到消息时,我发送的下一条消息将发送到同一端点?)
EDIT4:我已经用一些更具体的细节更新了原始实现。
使用问题评论中描述的ROUTER-DEALER模式
相关文章:
- Libmosquitto publish 不会将所有消息传递到 Azure IoT Hub
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 如何在 boost::asio 中将打包的结构作为消息传递?(无序列化)
- "Guaranteed Delivery"消息传递 - 我应该使用 MQTT 还是 ZeroMQ?
- 核心消息传递中未处理的异常.dll在程序关闭期间
- Microsoft具有本机消息传递和非持久连接的边缘扩展不起作用
- Firebase C 云消息传递背景问题
- 从客户端到浏览器的CEF中的消息传递序列化
- 我们是否可以使用 FireBase 云消息传递来发送或接收消息,或者在 Windows 桌面/控制台或 Linux 控制
- 如何将WM_KEYDOWN消息传递到 IWebBrowser2 实例
- 如何在 GNU Radio 中实现消息传递
- msgpack:C++和Java之间的消息传递
- 增强ASIO和线程之间的消息传递
- 交流时Chrome本机消息传递错误
- 多线程C++消息传递
- 跨平台最佳 MVC 模型到控制器消息传递方法(C#、Objective-C++)
- 如何在Chrome原生消息传递扩展的本机应用程序中使用本机主机消息
- 移动窗口(),跳过,躲避或绕过消息传递
- 无效输入会导致多语言 JSON 消息传递系统中的身份验证绕过
- ZMQ消息传递特定端点