【问题标题】:Can ZeroMQ be used to accept traditional socket requests?ZeroMQ 可以用来接受传统的套接字请求吗?
【发布时间】:2013-06-15 03:20:50
【问题描述】:

我正在尝试使用 ZeroMQ 重写我们的旧服务器之一,目前我有以下服务器设置(适用于 Zmq 请求):

    using (var context = ZmqContext.Create())
    using (var server = context.CreateSocket(SocketType.REP)) {
        server.Bind("tcp://x.x.x.x:5705");

        while (true) { ... }

如果我使用 Zmq 客户端库连接context.CreateSocket(SocketType.REQ),这种设置可以正常工作

但不幸的是,我们有很多遗留代码需要连接到该服务器,并且套接字是使用 .net 套接字库创建的:

    Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    Socket.Connect(ipAddress, port);

有没有办法编写一个 ZeroMQ 服务器来接受这些传统的 .net 套接字连接?

【问题讨论】:

    标签: sockets tcp zeromq nettcpbinding


    【解决方案1】:

    您可能必须使用 zmq 的 RAW 套接字类型(而不是 REP)来连接和读取客户端数据,而无需 zmq 特定的框架。

    C 中的 HTTP 服务器(来自 Pieter 的博客)
    http://hintjens.com/blog:42

    RAW Socket 类型信息
    https://github.com/hintjens/libzmq/commit/777c38ae32a5d1799b3275d38ff8d587c885dd55

    【讨论】:

    • 嘿@Raffian,谢谢,但不知道如何实现。没有 RAW 的 SocketType,你有可以提供的例子吗?
    • 是的,这是 Pieter 写的,hintjens.com/blog:42,它基本上是一个使用 zmq 原始套接字的 HTTP 服务器,它是 C 语言,但你应该能够将它移植到 .net,只要 .net它支持RAW 套接字,我知道纯Java zmq 库(jeromq)不...希望它有所帮助。
    • 感谢@Raffian,我无法直接链接到 ZMQ 库,我正在使用 clrzmq,.Net 实现所以这可能是不可能的
    【解决方案2】:

    您可以使用ZMQ_STREAM sockets 实现此目的。

    请注意,从 zeroMQ 4.x 开始,RAW 路由器选项 has been deprecated 用于新的 ZMQ_STREAM 套接字类型,其工作方式与 ROUTER + RAW 相同。

    不过,它似乎注定要进化。

    我最近在 4.0.1 版本中尝试了 ZMQ_STREAM 套接字。

    你可以打开一个,使用zmq_rcv直到你收到整个消息(你必须自己检查它是完整的),或者zmq_msg_rcv让ZeroMQ处理它。您将收到一个 identifier 消息部分,就像您在 ROUTER 套接字中找到的 identifier 一样,紧随其后的是一个 ONLY 身体部分。它们之间没有空分隔符,就像使用REQ Socket 与ROUTER Socket 通信一样。因此,如果您路由它们,请务必自己添加。

    但请注意:如果另一端存在延迟,或者您的消息超过 ZeroMQ ZMQ_STREAM 缓冲区(我的是 8192 字节长),您的消息可能会被 zeroMQ 解释为一系列消息。

    在这种情况下,您将收到尽可能多的不同 ZeroMQ 消息,包括 both 标识符部分 正文部分,您的工作是聚合它们,知道如果多个客户端正在与STREAM 套接字通信,它们可能会混淆。我个人使用哈希表,使用二进制标识符作为键,当我知道消息完成并发送到下一个节点时,从表中删除条目。

    使用zmq_msg_sendzmq_send 通过ZMQ_STREAM 发送可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      相关资源
      最近更新 更多