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 解决了这个问题?的主要内容,如果未能解决你的问题,请参考以下文章