Mar*_*lec 8 sockets tcp nettcpbinding zeromq
我正在尝试使用ZeroMQ重新编写一个旧服务器,现在我有以下服务器设置(适用于Zmq请求):
using (var context = ZmqContext.Create())
using (var server = context.CreateSocket(SocketType.REP)) {
server.Bind("tcp://x.x.x.x:5705");
while (true) { ... }
Run Code Online (Sandbox Code Playgroud)
如果我使用Zmq客户端库进行连接,这种设置可以正常工作 context.CreateSocket(SocketType.REQ)
但不幸的是,我们有很多需要连接到这个服务器的遗留代码,而套接字是使用.net socket libs创建的:
Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Socket.Connect(ipAddress, port);
Run Code Online (Sandbox Code Playgroud)
有没有办法编写ZeroMQ服务器来接受这些传统的.net套接字连接?
Tie*_*une 15
您可以使用ZMQ_STREAM套接字实现此目的.
请注意,由于zeroMQ 4.x,RAW路由器选项已被弃用于新的ZMQ_STREAM套接字类型,其工作方式与ROUTER + RAW相同.
但它似乎必然会发展.
我最近在4.0.1版本中尝试了ZMQ_STREAM套接字.
你可以打开一个,zmq_rcv直到你收到整个消息(你必须自己检查它是完整的),或zmq_msg_rcv让ZeroMQ处理它.您将收到一个标识符消息部分,就像您在套接字中找到的标识符一样ROUTER,后面紧跟一个唯一的 正文部分.它们之间没有空的分隔符,就像使用REQSocket与Socket交谈一样ROUTER.因此,如果您路由它们,请务必自行添加.
但请注意:如果另一端存在延迟,或者如果您的消息超过ZeroMQ ZMQ_STREAM缓冲区(我的长度为8192字节),则您的消息可以被zeroMQ解释为一系列消息.
在这种情况下,您会收到许多不同的ZeroMQ消息,包括两个标识符部和主体部分,它是你的工作,聚集他们,因为他们知道如果几个客户交谈的STREAM插座,它们可能会混淆.我个人使用二进制标识符作为密钥的哈希表,当我知道消息完成并发送到下一个节点时,从表中删除该条目.
通过发送ZMQ_STREAM带有zmq_msg_send或zmq_send工作正常原样.
| 归档时间: |
|
| 查看次数: |
10616 次 |
| 最近记录: |