gpt4 book ai didi

sockets - ZeroMQ可以用来接受传统的socket请求吗?

转载 作者:可可西里 更新时间:2023-11-01 02:30:46 25 4
gpt4 key购买 nike

我正在尝试使用 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 sockets 实现此目的.

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

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

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

你可以打开一个,使用zmq_rcv直到你收到整个消息(你必须自己检查它是完整的),或者zmq_msg_rcv让ZeroMQ处理它。您将收到一个标识符 消息部分,就像您在ROUTER 套接字中找到的标识符 一样,紧接着是一个ONLY 正文 部分。它们之间没有空分隔符,就像使用 REQ 套接字与 ROUTER 套接字通信一样。所以如果你路由它们,一定要自己添加。

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

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

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

关于sockets - ZeroMQ可以用来接受传统的socket请求吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17176871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com