【发布时间】:2019-12-30 09:29:08
【问题描述】:
struct mmsghdr 中的这三个成员之一:
void *msg_control; /* ancillary data, see below */
size_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
导致问题:sendmmsg() 返回 -1,“没有可用的缓冲区空间”。
memset(&(Msgs),0,sizeof(struct mmsghdr)); 问题消失后。
手册页之一说msg_flags 被忽略了,msg_control 是不是搞砸了?
【问题讨论】:
-
msg_controllen怎么样?也许它恰好包含一个任意大的垃圾值。 -
请提供minimal verifiable example。您似乎是在说,当您没有明确设置
Msgs字段时,您会收到错误消息。那也就不足为奇了。但是如果没有完整的代码示例,就不可能确切地说出问题所在。 -
我不知道确切的原因,但总的来说,如果 input 参数被留下未初始化! 在在这种情况下,将
msg_controllen设置为零可能就足够了,但通常初始化所有输入参数似乎更好。 -
@kaylum 我无法提供代码示例,因为类似的代码结构(这就是为什么我今天下午想了几个小时,相同的块代码完全没问题,只是源文件中的位置不同)会产生不同的编译器的堆栈布局,我没有“权限”将整个代码输出,所以没有。我将其作为问题发布的主要原因是很少有人会使用 sendmmsg() 系统调用,并且可能会告诉他们初始化 mmsghdr 是必需的,而且我的声誉不能让我将其添加到涉及 sendmsg() 的类似问题中。手册页有时解释得很糟糕。
-
没有要求您输入整个代码。您被要求提供minimal verifiable example。请阅读链接以了解其含义。如果您想继续使用 Stackoverflow,请阅读一些 help 页面以了解职位要求。