ZMQ消息传递特定端点

时间:2013-05-06 17:29:23

标签: c# c++ security rsa zeromq

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

但是现在我的协议已经发展,我正在与ZMQ陷入困境。我的协议要求我知道我正在与哪个端点通话,以便我可以将正确的RSA密钥应用于已发送的消息。

简要介绍一下我需要做些什么可能会有所帮助。我正在使用REQ和REP套接字。客户端使用REQ套接字,服务器使用REP套接字。

  1. 每个客户端通过tcp通过socket.connect()连接到服务器,并发送一个快速请求让服务器知道它在那里。
  2. 服务器通过每秒轮询套接字并发出receiveReady事件来接收请求。服务器通过字符串发送命令通知客户端生成私钥/公钥。
  3. 客户端执行此操作,然后通过字符串再次将公钥发送到服务器。
  4. 服务器获取密钥后,会创建一个Client对象,该对象将密钥和套接字存储到该客户端。 (这是协议中断的地方)。
  5. 然后,只要服务器需要向客户端发送信息,它就会遍历客户端对象并加密并将消息发送给正确的收件人。
  6. 我假设SocketEventArgs中的Socket将套接字返回到引发事件的端点。 (类似于在非ZMQ C#中接受连接)这似乎是错误的。 SocketEventArgs中的套接字似乎是所有客户端连接到的“全局”套接字。因此,当客户端连接时,我最终会失去对套接字的跟踪。

    所以我的问题是,我该如何做这项工作?如果可能的话,我很乐意保留ZMQ,因为它非常适合我并且为我解决了许多小边缘情况。如果那是不可能的,那么ZMQ是否有另一个类似的框架可以让我引用特定的端点?

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

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

    EDIT2:这个stackoverflow问题类似于我的Identifying the origin of ZMQ messages?,并支持我必须以某种方式识别我发送给服务器的每条消息的概念。但就我的具体情况而言,我并不关心IP地址或类似的东西。我只是希望能够存储端点,以便我以后可以与他们交谈。现在看起来ZMQ似乎无法做到这一点。

    听起来合理吗?

    1. 每个客户端都连接到服务器并发送一个快速请求,让服务器知道它在那里。请求包含第一帧中预先添加的唯一ID。
    2. 服务器确认请求并通知客户端生成私钥/公钥。
    3. 客户端执行此操作,然后将公钥发送到服务器。
    4. 服务器获取密钥后,会创建一个Client对象,用于存储密钥和客户端的唯一ID。
    5. 然后,客户端每隔几秒就会向服务器轮询一次新信息。
    6. 每当服务器有新的信息要发送时,它等待客户端轮询服务器,然后在套接字上回复该客户端。 (这就是让我担心的问题。如何确保每个客户端连接到的“全局”套接字收到一条消息,表明我发送的下一条消息会发送到同一个端点?)
    7. EDIT3:我简直不敢相信我忘了插入我的套接字类型。我目前正在使用REQ-REP模式,其中每个客户端都是套接字类型REQ,服务器是REP套接字。服务器绑定到端口,客户端直接连接到它。所有这一切都是通过tcp完成的,因为客户端可以在世界上的任何地方。

      EDIT4:我已经用更具体的内容更新了原始实现。

1 个答案:

答案 0 :(得分:2)

使用ROUTER-DEALER模式,如问题评论中所述。