gpt4 book ai didi

C sendmsg() 没有可用的缓冲区空间

转载 作者:太空狗 更新时间:2023-10-29 17:22:20 25 4
gpt4 key购买 nike

我不是 C 编程专家,但我正在尝试使用 sendmsg() 和 recvmsg() 编写一个相当简单的程序来在客户端和服务器(两者都在同一台机器上,所以基本上我是在向本地主机发送消息)。

在初始化所需的结构(如在 iovec 和 msghdr 中)并成功将客户端连接到服务器后,我的 sendmsg() 调用失败并显示“没有可用的缓冲区空间”错误号。

这是关于此类错误的 linux man 报告:

The output queue for a network interface was full. This generally indicates that the interface has stopped sending, but maybe caused by transient congestion. (Normally, this does not occur in Linux. Packets are just silently dropped when a device queue overflows.)

我在 Internet 上环顾四周,结果发现 sendmsg() 并没有被广泛使用,并且没有人会与这种类型的错误相关联。我发现的唯一有用的建议是检查可能过多的打开套接字,但我总是再次关闭我创建的每个套接字。

所以我被卡住了,主要是因为我是个菜鸟,不知道去哪里解决这类问题。

如果有人知道如何进行,那就太好了。(请不要告诉我不要使用 sendmsg(),因为我工作的全部目的是理解这个系统调用,而不是向我自己发送消息)

这是我目前在 pastebin 上编写的代码:clientserver

--已解决--

非常感谢。我已经能够解决这个问题并修复了我犯的其他错误,所以这里是 sendmsg() 和 recvmsg() 工作消息传递的功能代码:ClientServer

最佳答案

正如其他人所指出的,iovlen 应该为 1。而且,您还想在初始化它的某些字段之前将 mh 清零,因为您可能在未初始化的字段中发送垃圾并且系统调用变得困惑。此外,设置 msg_name 和 msg_namelen 没有任何意义,因为您已连接并且无法改变您对将数据发送到何处的想法。

这就是在您的客户端代码中对我有用的:

/* The message header contains parameters for sendmsg.    */
memset(&mh, 0, sizeof(mh));
mh.msg_iov = iov;
mh.msg_iovlen = 1;

printf("mh structure initialized \n");

关于C sendmsg() 没有可用的缓冲区空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12820256/

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