Linux:在TCP套接字上发送全部消息或不发送任何消息



我正在向非阻塞TCP套接字发送各种自定义消息结构。我想在一个send()调用中发送整个结构,或者如果发送缓冲区中只有部分消息的空间,则返回一个没有发送字节的错误(即send(()返回EWOULDBLOCK)。如果没有足够的空间,我会丢弃整个结构并报告溢出,但我希望在那之后可以恢复,即接收器只接收到一系列有效的完整结构。有没有一种方法可以检查发送缓冲区的可用空间,或者告诉send()调用按照描述进行?基于数据报的套接字不是一个选项,必须是基于连接的TCP。谢谢

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

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

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

但这种方法存在两个问题。首先,它是特定于Linux的。第二,当没有足够的空间发送你的全部信息时,你打算怎么办?循环并再次呼叫select?但这只会告诉您套接字已准备好再次写入,导致您忙于循环。

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

TCP不支持事务;这是您必须在第7层(应用程序)上处理的问题。

相关内容

最新更新