C# ZeroMq recv未阻塞
虽然我的背景是C#,但我正在尝试学习ZeroMq for project at work,在最简单的测试中,我似乎遇到了一个问题,C# ZeroMq recv未阻塞,c#,c++,zeromq,C#,C++,Zeromq,虽然我的背景是C#,但我正在尝试学习ZeroMq for project at work,在最简单的测试中,我似乎遇到了一个问题,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)
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());
}
}
现在我启动服务器,然后启动客户机。我正确地收到了第一条消息,并且能够正确地打印此消息。
但是现在,当我再次点击socket.recv(&message)时,代码不会阻塞,而是会抛出一个异常,因为底层的zmq\u msg\u recv(…)
返回一个-1的值
我不确定为什么会发生这种情况,我看不出它为什么期待另一条消息,因为我知道这个端口上没有其他消息。我遇到的唯一一件事是调用zmq\u msg\u close(…)
,但这应该作为消息的一部分调用,我已经确认了这一点
在套接字设置方面,或者在如何使用它进行recv(…)
调用以停止阻塞方面,是否存在任何错误?您的问题是,您无法使用REQ-REP模式连续接收2个请求
在请求-应答模式中,每个请求都需要一个应答。您的客户端需要阻止,直到收到对其第一个请求的答复。此外,您的服务器需要在为新请求提供服务之前回复请求
这是一个引用,指的是你的确切问题,从
REQ-REP套接字对处于锁定状态。客户端发出zmq_send()
然后zmq_recv(),在一个循环中(或者如果它只需要一次的话)。做
将产生任何其他序列(例如,一行发送两条消息)
在send或recv调用的返回代码-1中。同样地
服务按顺序发出zmq_recv(),然后再发出zmq_send(),这是常见的
正如它需要的那样
您的问题是,您不能使用REQ-REP模式在一行中接收2个请求
在请求-应答模式中,每个请求都需要一个应答。您的客户端需要阻止,直到收到对其第一个请求的答复。此外,您的服务器需要在为新请求提供服务之前回复请求
这是一个引用,指的是你的确切问题,从
REQ-REP套接字对处于锁定状态。客户端发出zmq_send()
然后zmq_recv(),在一个循环中(或者如果它只需要一次的话)。做
将产生任何其他序列(例如,一行发送两条消息)
在send或recv调用的返回代码-1中。同样地
服务按顺序发出zmq_recv(),然后再发出zmq_send(),这是常见的
正如它需要的那样
“@”
字符的作用是什么?我的代码中没有这个。啊,我明白了,它使字符串成为文字。因此它不能使用转义字符'\'
,'@'
字符做什么?我的代码中没有这个。啊,我明白了,它使字符串成为文字。因此,它不能使用转义字符“\'
,这表明我应该注意文档的完整部分。在处理完收到的消息后,我通过发送一条空消息来解决问题。谢谢。我只是想表明我应该注意文档的完整部分。在处理完收到的消息后,我通过发送一条空消息来解决问题。谢谢
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");
}