【发布时间】:2012-10-10 13:15:28
【问题描述】:
我不是 C 编程专家,但我正在尝试编写一个相当简单的程序,使用 sendmsg() 和 recvmsg() 在客户端和服务器之间发送消息(两者都在同一台机器上,所以基本上我是在向 localhost 发送消息)。
在初始化所需的结构(如在 iovec 和 msghdr 中)并成功将客户端连接到服务器后,我的 sendmsg() 调用失败并出现“没有可用的缓冲区空间”错误。
这是 linux man 报告的此类错误:
网络接口的输出队列已满。这一般表示接口已经停止发送,但可能是暂时拥塞造成的。 (通常情况下,这在 Linux 中不会发生。当设备队列溢出时,数据包会被静默丢弃。)
我在互联网上四处寻找,结果发现 sendmsg() 没有被广泛使用,没有人能与这种类型的错误联系起来。我发现的唯一有用的建议是检查是否有过多的打开套接字,但我总是关闭我创建的每个套接字。
所以我被困住了,主要是因为我是个菜鸟,我不知道该去哪里解决这类问题。
如果有人知道如何继续,那就太好了。 (请不要告诉我不要使用 sendmsg(),因为我工作的全部目的是理解这个系统调用,而不是向自己发送消息)
这是我目前在 pastebin 上编写的代码:client 和 server
--已解决--
非常感谢。我已经能够解决这个问题并修复了我犯的其他错误,所以这里是 sendmsg() 和 recvmsg() 工作消息传递的功能代码:Client 和 Server
【问题讨论】:
-
或unix域(或socketpair)?
-
您的意思是
ENOBUFS错误,对吗?嗯,这确实很奇怪。您能否提供一个最小的测试用例,以便其他人可以尝试重现它? -
我使用面向连接的 AF_INET 套接字(类型 SOCK_STREAM),所以是 TCP。
-
@xHawk 请注意,在您展示代码后,您获得实际答案的速度有多快。随意就 a) 谈论描述代码和 b) 实际代码的相对价值得出结论。尤其是当已知代码有一个或多个错误时...
标签: c