我正在使用C ++ TCP / IP套接字。根据我的要求,我的客户端必须连接到服务器并读取它发送的消息(这是真的很新,不是吗)但是...在我的应用程序中我必须等待一段时间(通常是1到2小时)在我真正开始阅读消息之前(通过recv()或read()),服务器仍然继续发送消息。
我想知道缓冲区的容量是否有限制,以便在未读取这些消息并且其物理内存用于缓冲这些消息的情况下保留这些消息?发件人或收件人的?
答案 0 :(得分:7)
TCP数据在发送方和接收方都进行缓冲。接收器的套接字接收缓冲区的大小决定了在没有确认的情况下可以传输多少数据,并且发送方的发送缓冲区的大小决定了在发送方阻塞或获取EAGAIN / EWOULDBLOCK之前可以发送多少数据,具体取决于阻塞/非阻止阻止模式。您可以将这些套接字缓冲区设置为最大2 ^ 32-1字节,但如果将客户端接收缓冲区设置为高于2 ^ 16-1,则必须在连接套接字之前执行此操作,以便TCP窗口缩放可以在连接握手中进行协商,以便高16位可以起作用。 [此处服务器接收缓冲区不相关,但如果您将其设置为> = 64k,则需要在侦听套接字上设置它,接收套接字将从该套接字继承它,这样握手可以协商窗口缩放。
然而,我完全赞同马丁詹姆斯,这是一个愚蠢的要求。它浪费了一个线程,一个线程堆栈,一个套接字,一个大型套接字发送缓冲区,一个FD,以及服务器上所有其他相关资源两个小时,并可能影响其他线程,从而影响其他客户端。它还错误地给服务器一个接收到两个小时的数据的印象,当它实际上只被传输到接收缓冲区时,这可能导致恢复情况中的未知复杂性:例如,服务器可能无法重建到目前为止发送的数据。在准备好开始接收数据之前,最好不要连接,或者在客户端读取和假脱机数据以便以后处理。