我正在尝试学习Zeromq在工作中的项目,尽管我的背景在C#中,并且在最简单的测试中,我似乎遇到了一个问题,socket.recv(...)
调用将阻止首先收到的消息,但是在此之后,由于接收到的数据量为-1。
当前我的"服务器"是:
zmq::context_t context(1);
zmq::socket_t socket(context, ZMQ_REP);
socket.bind("tcp://127.0.0.1:5555");
while (true)
{
zmq::message_t message;
if (socket.recv(&message))
{
auto str = std::string(static_cast<char*>(message.data()), message.size());
printf("Receieved: %sn", str.c_str());
}
}
这基本上是从Zeromq文档中的第一个示例服务器。
中的第一个示例服务器。我使用此代码从c#'client'推
using (var context = new ZContext())
using (var requester = new ZSocket(context, ZSocketType.REQ))
{
requester.Connect(@"tcp://127.0.0.1:5555");
requester.Send(new ZFrame(@"hello"));
requester.Disconnect(@"tcp://127.0.0.1:5555");
}
现在我启动服务器,然后启动客户端。我正确地收到了第一条消息,并且能够正确打印。但是现在,当我再次击中socket.recv(&message)
时,代码不会阻止,而是会抛出异常,因为基础zmq_msg_recv(...)
返回-1。
我不确定为什么会发生这种情况,我看不出为什么它会期待另一个消息,因为我知道此端口上没有其他信息。我遇到的唯一一件事就是调用zmq_msg_close(...)
,但这应该称为message_t
驱动器的一部分,我已确认。
在插座设置方面,我有什么做错的事情,还是我如何将其用于recv(...)
调用以停止阻塞?
您的问题是,您无法连续收到2个使用REQ-REP模式的请求。
在请求模式中,每个请求都需要答复。您的客户需要阻止,直到收到对其第一个请求的答复。另外,您的服务器需要在为新请求服务之前回复该请求。
这是指指南中的确切问题的报价。
REQ-REP插座对锁定。客户发出ZMQ_SEND() 然后在循环中zmq_recv()(如果需要的话,则一次)。正在做 任何其他序列(例如,连续发送两条消息)都将结果 在发送或RECV调用中的-1的返回代码中。同样, 服务问题ZMQ_RECV(),然后按以下顺序进行ZMQ_SEND()