我正在尝试使用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 libs创建的:
Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
Socket.Connect(ipAddress, port);
有没有办法编写ZeroMQ服务器来接受这些传统的.net套接字连接?
答案 0 :(得分:14)
您可以使用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 < em> body 部分。它们之间没有空的分隔符,就像使用REQ
Socket与ROUTER
Socket交谈一样。因此,如果您路由它们,请务必自行添加。
虽然小心:如果在另一端的延迟,或者如果您的邮件超过ZeroMQ ZMQ_STREAM
缓冲器(矿是8192个字节长),您的消息可以由zeroMQ作为一系列消息被解释页。 >
在这种情况下,您将收到尽可能多的不同ZeroMQ消息,包括两者标识符部分和正文部分,并且您的工作是聚合它们,知道如果有几个客户端正在与STREAM
套接字进行通信,则它们可能会混淆。我个人使用二进制标识符作为键的哈希表,当我知道消息完成并发送到下一个节点时,从表中删除该条目。
使用ZMQ_STREAM
或zmq_msg_send
发送zmq_send
可以正常工作。
答案 1 :(得分:4)
您可能必须使用zmq的RAW套接字类型(而不是REP)来连接和读取客户端数据,而不使用zmq特定的框架。
C中的HTTP服务器(来自Pieter的博客)
http://hintjens.com/blog:42
RAW套接字类型信息
https://github.com/hintjens/libzmq/commit/777c38ae32a5d1799b3275d38ff8d587c885dd55