sendmmsg() return -1,没有可用的缓冲区空间,为啥 memset 解决了这个问题?

Posted

技术标签:

【中文标题】sendmmsg() return -1,没有可用的缓冲区空间,为啥 memset 解决了这个问题?【英文标题】:sendmmsg() return -1, no buffer space available, why does memset solve this?sendmmsg() return -1,没有可用的缓冲区空间,为什么 memset 解决了这个问题? 【发布时间】: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。请阅读链接以了解其含义。如果您想继续使用 ***,请阅读一些 help 页面以了解职位要求。 【参考方案1】:

可能你已经获取了这个结构的局部变量。 默认情况下,局部变量使用垃圾初始化,导致此问题。 您甚至可以通过使用相同的全局变量来尝试这样做。

【讨论】:

这是真的,原因在上面。但是不好的建议,只需初始化它就可以了。

以上是关于sendmmsg() return -1,没有可用的缓冲区空间,为啥 memset 解决了这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

return的用法

break continue return

C语言里return 0和return 1啥意思

3.3 js函数

检查资源预留可用性

10-1:return可以没有返回值吗?