ZeroMQ可以用来接受传统的套接字请求吗?

2024-05-05

我正在尝试使用 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 套接字连接?


您可以使用以下方法实现此目的ZMQ_STREAM 套接字 http://api.zeromq.org/4-0:zmq-socket#toc19.

请注意,从 ZeroMQ 4.x 开始,RAW 路由器选项已被弃用 http://comments.gmane.org/gmane.network.zeromq.devel/19547对于新的 ZMQ_STREAM 套接字类型,其工作方式与 ROUTER + RAW 相同。

不过,它似乎必然会发展。

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

您可以打开一个,使用zmq_rcv直到您收到完整的消息(您必须自己检查消息是否完整),或者zmq_msg_rcv让 ZeroMQ 处理它。您将收到一个标识符消息部分,就像标识符你会发现在ROUTER套接字,后面直接跟一个ONLY body部分。它们之间没有空分隔符,就像使用REQ套接字与一个ROUTER插座。因此,如果您路由它们,请务必自行添加。

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

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

通过一个发送ZMQ_STREAM with zmq_msg_send or zmq_send按原样工作正常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZeroMQ可以用来接受传统的套接字请求吗? 的相关文章

随机推荐