我可以获得套接字缓冲区的大小吗?

时间:2014-01-12 16:42:40

标签: c sockets buffer

我有一个实时系统,所以我使用非阻塞套接字发送我的数据 但是发生了套接字缓冲区已满, 所以send函数的返回值小于我的数据长度。

如果我保存返回长度并重新发送,阻塞套接字没有什么不同?

那么我可以获得套接字缓冲区的剩余大小吗?我可以先检查一下, 如果它足够,那么我打电话给发送,跳过发送其他。

谢谢大家。

2 个答案:

答案 0 :(得分:1)

阻塞和非阻塞之间存在差异 - 如果您遇到短写,则不会阻止。这就是非阻塞的重点。它让你有机会在等待一些缓冲空间释放时做一些更紧迫的事情。

您的担忧似乎是反复尝试撰写完整的邮件,即一种投票形式。但是检查缓冲区中的空闲字节是一回事,你只需要通过调用write来调用可用性。你真的没有获得任何效率明智的东西。

常见的解决方案是使用selectpoll之类的东西来监视套接字描述符,以便能够写入(和至少一些)字节。这允许您停止轮询并在内核上强制执行某些工作以监视空间可用性。

也就是说,如果你真的想查看有多少可用空间,那么通常会解决某些特定于平台的问题,主要是ioctl调用各种平台特定参数,如FIONWRITESIOCOUTQ等。您需要准确调查平台提供的内容。但是,再一次,最好先考虑一下这是否真的是你需要的东西。

答案 1 :(得分:0)

如果异步sendEWOULDBLOCK / EAGAIN失败,则不会发送任何数据。然后你可以尝试发送其他东西,或者等到缓冲区再次空闲。

另见https://stackoverflow.com/questions/19391208/when-a-non-blocking-send-only-transfers-partial-data-can-we-assume-it-would-r - 在那里讨论相关问题。