Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ZeroMq recv未阻塞_C#_C++_Zeromq - Fatal编程技术网

C# ZeroMq recv未阻塞

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)

虽然我的背景是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)
{
    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");
}