c# - ZMQ消息传递特定端点

标签 c# c++ security rsa zeromq

我目前正在使用ZMQ作为在C#服务器和多个C++客户端之间发送信息的方式。到目前为止,由于不同语言之间的标准协议(protocol),ZMQ已经完美地工作了。

但是现在随着我的协议(protocol)的发展,我正与ZMQ碰壁。我的协议(protocol)要求我知道当前正在与哪个端点进行通讯,以便可以对发送的消息应用正确的RSA密钥。

简要概述我需要做的事情可能会有所帮助。我正在使用REQ和REP套接字。客户端使用REQ套接字,服务器使用REP套接字。

  • 每个客户端都通过socket.connect()通过tcp连接到服务器,并发送快速请求以让服务器知道它在那里。
  • 服务器通过每秒轮询套接字并引发receiveReady事件来接收请求。服务器通过字符串发送命令来通知客户端生成私钥/公钥。
  • 客户端这样做,然后通过字符串再次将公钥发送到服务器。
  • 服务器获取密钥后,它将创建一个Client对象,该对象存储密钥和该客户机的套接字。 (这是协议(protocol)中断的地方)。
  • 然后,每当服务器需要将信息发送到客户端时,它就会遍历Client对象并进行加密,然后将消息发送给正确的收件人。

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

    所以我的问题是,我该如何进行这项工作?如果可能的话,我希望保留ZMQ,因为使用它非常好,可以为我解决许多小问题。如果不可能,是否有与ZMQ相似的框架允许我引用特定的端点?

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

    编辑:考虑一下,一种解决方案可能是在每个消息之前添加一个字符串以标识套接字。由于当前的实现方式仅对下行到客户端的信息进行加密。尽管这让我感到担忧,但作为一个具有数据包嗅探器的人可能能够相当轻松地模拟另一个客户端。

    EDIT2:这个stackoverflow问题类似于我的Identifying the origin of ZMQ messages?,并支持我必须以某种方式标识发送到服务器的每条消息的概念。但是对于我的具体情况,我不在乎IP地址或类似的东西。我只希望能够存储端点,以便以后再与他们交谈。似乎开始无法使用ZMQ实现。

    听起来合理吗?
  • 每个客户端都连接到服务器并发送快速请求,以使服务器知道它在其中。该请求包含在第一帧中添加的唯一ID。
  • 然后,服务器确认请求并通知客户端生成私钥/公钥。
  • 客户端这样做,然后将公钥发送到服务器。
  • 服务器获取密钥后,它将创建一个Client对象,该对象存储密钥和客户端的唯一ID。
  • 然后,客户端每隔几秒钟轮询一次服务器以获取新信息。
  • 只要服务器有要发送的新信息,它就会等待客户端轮询服务器,然后在套接字上回复该客户端。 (现在让我担心的是。我如何确保当每个客户端都连接到的“全局”套接字接收到一条消息,即我发送的下一条消息将到达相同的端点?)

  • EDIT3:我不敢相信我忘记输入套接字类型。我当前正在使用REQ-REP模式,其中每个客户端的套接字类型为REQ,服务器为REP套接字。服务器绑定(bind)到端口,客户端直接连接到该端口。所有这些都是通过tcp完成的,因为客户端可以位于世界任何地方。

    EDIT4:我已经用一些更详细的内容更新了原始实现。

    最佳答案

    使用问题注释中所述的ROUTER-DEALER模式。

    关于c# - ZMQ消息传递特定端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16403969/

    相关文章:

    c# - 确定某个区域内是否有任何游戏对象的最佳方法是什么

    c++ - ZScript 文件执行到 DLL

    c# - 使用 NUnit——如何获取当前正在执行的测试夹具和名称?

    c++ - 无法在 Mac 终端中运行 qmake

    c++ - 行为类似于弹出窗口的 MFC 子对话框(从 VC6 更改升级)

    apache - 使用 Apache 2.4 生成随机数(用于内容安全策略 header )

    c# - 使用 XMS .NET API 对抗具有安全导出的安全通道

    php - 如何准备具有动态数量参数的语句?

    c# - 推荐XNA教程开始学习3D(第一次)

    c# - 每像素 1 位的大位图导致 OutOfMemoryException