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

Sockets ZeroMQ可以用来接受传统的套接字请求吗?,sockets,tcp,zeromq,nettcpbinding,Sockets,Tcp,Zeromq,Nettcpbinding,我正在尝试使用ZeroMQ重新编写一个旧服务器,目前我有以下服务器设置(适用于Zmq请求): 如果我使用Zmq客户端库连接context.CreateSocket(SocketType.REQ) 但不幸的是,我们有很多需要连接到此服务器的遗留代码,这些套接字是使用.net套接字libs创建的: Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Socket.Conn

我正在尝试使用ZeroMQ重新编写一个旧服务器,目前我有以下服务器设置(适用于Zmq请求):

如果我使用Zmq客户端库连接
context.CreateSocket(SocketType.REQ)

但不幸的是,我们有很多需要连接到此服务器的遗留代码,这些套接字是使用.net套接字libs创建的:

    Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    Socket.Connect(ipAddress, port);

有没有办法编写ZeroMQ服务器来接受这些传统的.net套接字连接?

您可能必须使用zmq的原始套接字类型(而不是REP)来连接和读取客户端数据,而无需zmq特定的框架

C语言的HTTP服务器(来自Pieter的博客)

原始套接字类型信息

您可以使用以下方法实现此目的

请注意,由于zeroMQ 4.x是新ZMQ_流套接字类型的原始路由器选项,其工作方式与router+RAW相同

不过,它似乎注定要进化

我最近在版本4.0.1中尝试了ZMQ_流套接字

您可以打开一个,使用
zmq\u rcv
直到您收到整个消息(您必须自己检查它是否完整),或者使用
zmq\u msg\u rcv
让ZeroMQ处理它。您将收到一个标识符消息部分,就像您在
路由器
套接字中找到的标识符一样,后面紧跟一个主体部分。它们之间没有空的分隔符,就像使用
REQ
套接字与
路由器
套接字通信一样。因此,如果你给它们布线,一定要自己加上去

但是要小心:如果另一端有延迟,或者如果您的消息超过ZeroMQ
ZMQ_STREAM
缓冲区(我的缓冲区长8192字节),ZeroMQ可以将您的消息解释为一系列消息

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


使用
ZMQ\u msg\u send
ZMQ\u send
通过
ZMQ\u流发送,效果很好。

Hey@Raffian,谢谢,但不确定如何实现。没有SocketType的RAW,你能提供一个例子吗?是的,这里有一个Pieter写的,它基本上是一个使用zmq RAW套接字的HTTP服务器,它是用C编写的,但是你应该能够将它移植到.net,只要.net支持
RAW
socket,我知道纯Java zmq库(jeromq)没有…希望它能有所帮助。谢谢@Raffian,我不能直接链接到ZMQ库,我使用的是clrzmq,即.Net实现,所以这在当时可能是不可能的
    Socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
    Socket.Connect(ipAddress, port);