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

时间:2013-06-18 19:04:53

标签: sockets tcp zeromq nettcpbinding

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

2 个答案:

答案 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_STREAMzmq_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