gpt4 book ai didi

您可以使用 NULL 缓冲区和 0 长度调用 zmq_recv 以跳过消息吗?

转载 作者:行者123 更新时间:2023-12-04 04:32:29 27 4
gpt4 key购买 nike

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

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

关于您可以使用 NULL 缓冲区和 0 长度调用 zmq_recv 以跳过消息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20354244/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com