Sockets 如果由于缓冲区已满错误导致发送失败,是否可以增加套接字发送缓冲区大小

Sockets 如果由于缓冲区已满错误导致发送失败,是否可以增加套接字发送缓冲区大小,sockets,Sockets,如果TCP套接字设置为非阻塞模式,并且最初设置了套接字发送缓冲区, 然后在循环中使用send发送所有数据。如果由于EAGAIN错误导致发送失败,是否可以增加发送套接字缓冲区? 我正在使用Linux操作系统。我想了解是否允许调整sendbuffer大小。在tcp man上,“在单个连接上,必须在侦听(2)或连接(2)调用之前设置套接字缓冲区大小,以使其生效。”这就是为什么会出现这个问题,您可以尝试,但这可能不是一个好主意。无论缓冲区大小如何,问题都可能发生,因此您需要编写代码来处理这种情况。这将是

如果TCP套接字设置为非阻塞模式,并且最初设置了套接字发送缓冲区, 然后在循环中使用send发送所有数据。如果由于EAGAIN错误导致发送失败,是否可以增加发送套接字缓冲区?
我正在使用Linux操作系统。我想了解是否允许调整sendbuffer大小。在tcp man上,“在单个连接上,必须在侦听(2)或连接(2)调用之前设置套接字缓冲区大小,以使其生效。”这就是为什么会出现这个问题,您可以尝试,但这可能不是一个好主意。无论缓冲区大小如何,问题都可能发生,因此您需要编写代码来处理这种情况。

这将是内核内网络堆栈的实现细节,即您运行的操作系统的实现细节(您没有说明)。我相信在大多数现代操作系统上都可以做到这一点,因为这只是一个限制特定套接字的内存数量的方法,但这是一种完全错误的解决问题的方法,因为:

  • 您不能无限期地增加发送缓冲区大小,操作系统会在某个时间限制它
  • TCP为您提供了流量控制—慢速接收器减慢了快速发送器—这是TCP的一个优点,与它的可靠性有关,因此如果接收器消耗数据的速度不够快,将更多数据推入内核内存并不会以任何方式改善这种情况
  • 你只是在偷懒,希望内核为你做所有的缓冲

计算您的流量突发内存需求、预设的套接字发送缓冲区大小、应用程序端的缓冲区。

我使用的是Linux操作系统。我想了解是否允许调整sendbuffer大小。在tcp手册页上,“在单个连接上,必须在侦听(2)或连接(2)调用之前设置套接字缓冲区大小,以使其生效。”这就是为什么会出现这个问题。这就是Linux的答案-你不能,你必须预先设置它。因此,应该在应用程序端将发送缓冲区大小预设为最大缓冲区大小,如果我需要在非阻塞模式下使用socket并发送所有数据?不一定是最大值-对于您的应用程序来说足够大。如果接收器速度足够慢,您仍可能达到该限制。这就是为什么我说你也需要在应用程序端进行缓冲。当我使用setsockopt测试设置SO_SNDBUF时,我可以看到使用getsockopt,buffersize被更改为新值。我认为手册页是错误的。我认为应该说,在listen()或connect()之前必须设置超过64k的缓冲区大小,因为这是发生窗口规模协商的时候。事实上,即使在这种情况下,也应该说在accept()之前,而不是listen()。请注意,这只适用于接收缓冲区,而不是发送缓冲区。