c-可以用NULL缓冲区和0长度调用zmq_recv来跳过消息吗



我正在使用zmq(3.2),并且正在使用多部分消息。我正在处理一些错误情况,其中第一个消息部分无效,我想丢弃其余部分。我当时想的是一些类似的东西。

void zmq_drain_multipart(void *sock)
{
    int more;
    size_t size = sizeof(int);
    zmq_getsockopt(sock, ZMQ_RCVMORE, &more, &size);
    while (more)
    {
        zmq_recv(sock, NULL, 0, 0);
        zmq_getsockopt(sock, ZMQ_RCVMORE, &more, &size);
    }
}

这样的东西应该起作用吗。

IMO,正确性的最终权威是API页面http://api.zeromq.org/3-2:zmq-recv。尽管您的代码可以工作,并且可能会继续使用ZeroMQ的新版本,但您没有遵守规则。

参数2(buf)是对缓冲区的引用。没有提到可以提供NULL的任何特殊情况。幸运的是,如果接收到的有效载荷大于参数3(len),那么数据将被截断。这意味着您可以提供非常小的缓冲区。它可以是基于堆栈的,以避免任何内存分配成本,如下所示。

void zmq_drain_multipart(void *sock)
{
    int more;
    size_t size = sizeof(int);
    zmq_getsockopt(sock, ZMQ_RCVMORE, &more, &size);
    while (more)
    {
        char buf[32];
        zmq_recv(sock, buf, 32, 0);
        zmq_getsockopt(sock, ZMQ_RCVMORE, &more, &size);
    }
}

当出现问题时,这也有一个小优势。在执行调试器时,上面的代码将允许您检查正在接收和排出的每个片段的前几个字节。

在ZMQ 4.3中,您可以正式执行以下操作:"如果len为零,则buf参数可能为null。"http://api.zeromq.org/4-3:zmq-recv

最新更新