4

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

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

4

1 回答 1

10

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

但是,我完全同意 Martin James 的观点,即这是一个愚蠢的要求。它在服务器上浪费了一个线程、一个线程堆栈、一个套接字、一个大的套接字发送缓冲区、一个 FD 和所有其他相关资源两个小时,并可能影响其他线程并因此影响其他客户端。它还错误地给服务器一个接收到两个小时的数据的印象,而实际上它只被传输到接收缓冲区,这可能会导致恢复情况的未知复杂性:例如,服务器可能无法重建到目前为止发送的数据。在您准备好开始接收数据之前最好不要连接,或者在客户端读取数据并将数据假脱机以供以后处理。

于 2012-10-17T12:15:25.667 回答