2012-10-17 124 views
3

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

我想知道缓冲区的容量是否有限制,以防止这些消息在未被读取且其物理内存用于缓冲这些消息的情况下?发件人或收件人的?

+1

http://stackoverflow.com/questions/7865069/how-to-find-the-socket-buffer-size-of-linux http://pubs.opengroup.org/onlinepubs/009695399/functions/getsockopt。 html – DumbCoder

+5

这似乎是一个愚蠢的要求。当客户端的缓冲区空间已满时,TCP流可能会阻塞服务器。服务器缓存空间将被填满未发送的消息,影响其他客户端。你能提供更多细节吗?你能不能缓冲客户端用户空间中的消息并在等待时间后处理它们? –

回答

7

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

但是我完全同意马丁詹姆斯这是一个愚蠢的要求。它浪费了一个线程,一个线程堆栈,一个套接字,一个大套接字发送缓冲区,一个FD以及服务器上的所有其他关联资源两个小时,并可能影响其他线程以及其他客户端。它也错误地给服务器一个这样的印象:已经收到两个小时的数据,当它真的只被发送到接收缓冲区时,这可能导致在恢复情况中出现未知的复杂情况:例如,服务器可能无法重建迄今为止发送的数据。除非您准备好开始接收数据,否则在稍后处理客户端数据并读取并假脱机后,您最好不要连接。