ZeroMq recv没有阻止

时间:2016-11-30 16:36:57

标签: c# c++ zeromq

我正在尝试在工作中学习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(...)调用来阻止阻塞时,我有什么问题吗?

1 个答案:

答案 0 :(得分:4)

您的问题是您无法使用REQ-REP模式连续收到2个请求。

在请求 - 回复模式中,每个请求都需要回复。您的客户端需要阻止,直到它收到对其第一个请求的回复。此外,您的服务器需要在为新请求提供服务之前回复请求。

以下引用来自guide的确切问题。

  

REQ-REP套接字对是锁定的。客户端发出zmq_send()   然后是zmq_recv(),在一个循环中(或者只要它就是它需要的一次)。干   将产生任何其他序列(例如,连续发送两个消息)   在send或recv调用的返回码-1中。同样,   服务按顺序发出zmq_recv()和zmq_send(),经常发生   因为它需要。