C++套接字编程TCP/IP套接字缓冲区的最大大小



我使用的是C++TCP/IP套接字。根据我的要求,我的客户端必须连接到服务器并读取它发送的消息(这真的很新,不是吗),但是。。。在我的应用程序中,我必须等待一段时间(通常为1-2小时),然后才能真正开始读取消息(通过recv()或read()),而服务器仍在继续发送消息。

我想知道缓冲区的容量是否有限制,以防这些消息未被读取,以及谁的物理内存用于缓冲这些消息?发送方还是接收方?

TCP数据在发送方和接收方都有缓冲。接收器的套接字接收缓冲区的大小决定了有多少数据可以在没有确认的情况下传输,发送器的发送缓冲区的尺寸决定了在发送器阻止或获得EAGAIN/EWOULDBLOCK之前可以发送多少数据,具体取决于阻止/非阻止模式。您可以将这些套接字缓冲区设置为您喜欢的大小,最多2^32-1字节,但如果您将客户端接收缓冲区设置得高于2^16-1,则必须在连接套接字之前进行设置,以便在连接握手中协商TCP窗口缩放,从而使高16位可以发挥作用。[服务器接收缓冲区在这里不相关,但如果您将其设置为>=64k,则需要将其设置在侦听套接字上,从那里它将被接受的套接字继承,这样握手就可以协商窗口缩放。]

然而,我完全同意马丁·詹姆斯的观点,认为这是一个愚蠢的要求。它在服务器上浪费了一个线程、一个线程堆栈、一个套接字、一个大型套接字发送缓冲区、一个FD和所有其他相关资源两个小时,并可能影响其他线程,从而影响其他客户端。它还错误地给服务器一种印象,即已经收到了两个小时的数据,而数据实际上只发送到接收缓冲区,这可能会导致恢复情况中未知的复杂情况:例如,服务器可能无法重建之前发送的数据。在准备好开始接收数据之前,最好不要进行连接,或者在客户端读取数据并将数据后台处理给自己,以便稍后进行处理。

最新更新