ZeroMq recv not blocking



我正在尝试学习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()

最新更新