Linux:在TCP套接字上发送整个消息或不发送消息

发送各种自定义消息结构下非阻塞TCP套接字。 我想在一个send()调用中发送整个结构,或者如果发送缓冲区中只有部分消息(即send()返回EWOULDBLOCK),则返回一个没有发送字节的错误。 如果没有足够的空间,我会扔掉整个结构并报告溢出,但是我想在这之后可以恢复,也就是说接收者只能接收到一系列有效的完整结构。 有没有办法检查发送缓冲区的可用空间,或者告诉send()调用如上所述? 基于数据报的套接字不是一个选项,必须是基于连接的TCP。 谢谢。

技术合作计划不支持交易; 这是你必须处理第7层 (应用程序)的东西。

Linux提供了一个SIOCOUTQ ioctl()来查询TCP输出缓冲区中有多少数据:

http://www.kernel.org/doc/man-pages/online/pages/man7/tcp.7.html

您可以使用该值加上SO_SNDBUF的值来确定传出缓冲区是否有足够的空间用于任何特定的消息。 所以严格来说,你的问题的答案是“是”。

但是这个方法有两个问题。 首先,它是Linux专用的。 其次,如果没有足够的空间发送你的整个信息,你打算做什么? 循环和调用再次select ? 但是,这只会告诉你套接字已经准备好再次写入,导致你忙于循环。

为了效率的缘故,你应该咬紧牙关,只处理部分写入; 让网络堆栈担心将流分解成数据包以获得最佳吞吐量。