C++套接字编程TCP/IP套接字缓冲区的最大大小
C++ socket programming Max size of TCP/IP socket Buffer?
我使用的是C++TCP/IP套接字。根据我的要求,我的客户端必须连接到服务器并读取它发送的消息(这真的很新,不是吗),但是。。。在我的应用程序中,我必须等待一段时间(通常为1-2小时),然后才能真正开始读取消息(通过recv()或read()),而服务器仍在继续发送消息。
我想知道缓冲区的容量是否有限制,以防这些消息未被读取,以及谁的物理内存用于缓冲这些消息?发送方还是接收方?
TCP数据在发送方和接收方都有缓冲。接收器的套接字接收缓冲区的大小决定了有多少数据可以在没有确认的情况下传输,发送器的发送缓冲区的尺寸决定了在发送器阻止或获得EAGAIN/EWOULDBLOCK之前可以发送多少数据,具体取决于阻止/非阻止模式。您可以将这些套接字缓冲区设置为您喜欢的大小,最多2^32-1字节,但如果您将客户端接收缓冲区设置得高于2^16-1,则必须在连接套接字之前进行设置,以便在连接握手中协商TCP窗口缩放,从而使高16位可以发挥作用。[服务器接收缓冲区在这里不相关,但如果您将其设置为>=64k,则需要将其设置在侦听套接字上,从那里它将被接受的套接字继承,这样握手就可以协商窗口缩放。]
然而,我完全同意马丁·詹姆斯的观点,认为这是一个愚蠢的要求。它在服务器上浪费了一个线程、一个线程堆栈、一个套接字、一个大型套接字发送缓冲区、一个FD和所有其他相关资源两个小时,并可能影响其他线程,从而影响其他客户端。它还错误地给服务器一种印象,即已经收到了两个小时的数据,而数据实际上只发送到接收缓冲区,这可能会导致恢复情况中未知的复杂情况:例如,服务器可能无法重建之前发送的数据。在准备好开始接收数据之前,最好不要进行连接,或者在客户端读取数据并将数据后台处理给自己,以便稍后进行处理。
- 套接字读取后,我在缓冲区中看到意外输入
- 何时需要修改套接字的接收缓冲区大小?
- 为异步发送缓冲区保留内存(提升 asio 套接字)
- 套接字缓冲区到字符串
- 我正在编写一个简单的客户端套接字应用程序,但在连接后服务器收到一个空缓冲区
- 无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满
- 跨平台套接字发送,Linux 上的缓冲区常量无效* Windows上的常量字符*,最佳处理方式
- 为什么收到的缓冲区大小大于最初通过套接字发送的大小
- 套接字连接上的缓冲区溢出
- 增加 UDP 套接字中的接收缓冲区
- 从套接字读取到缓冲区
- 套接字:在没有memcpy的情况下,使用recvfrom将UDP数据获取到字对齐的缓冲区
- 页面对齐的套接字发送缓冲区
- C++套接字编程TCP/IP套接字缓冲区的最大大小
- 在Linux中发送套接字的缓冲区为空
- 如何确定/设置套接字缓冲区大小
- 如何在使用之前清除内部服务器套接字缓冲区的内容
- boost::asio-窥探套接字缓冲区
- UDP套接字缓冲区溢出检测
- 一次性读取整个套接字缓冲区