我正在尝试在工作中学习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: %s\n", str.c_str());
}
}
这基本上是遵循ZeroMq文档中的第一个示例服务器。
我正在使用此代码从C#'客户端'推送 1 位数据:
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(...)
调用来阻止阻塞时,我有什么问题吗?
答案 0 :(得分:4)
您的问题是您无法使用REQ-REP模式连续收到2个请求。
在请求 - 回复模式中,每个请求都需要回复。您的客户端需要阻止,直到它收到对其第一个请求的回复。此外,您的服务器需要在为新请求提供服务之前回复请求。
以下引用来自guide的确切问题。
REQ-REP套接字对是锁定的。客户端发出zmq_send() 然后是zmq_recv(),在一个循环中(或者只要它就是它需要的一次)。干 将产生任何其他序列(例如,连续发送两个消息) 在send或recv调用的返回码-1中。同样, 服务按顺序发出zmq_recv()和zmq_send(),经常发生 因为它需要。