我正在使用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