如果由于缓冲区完全错误导致发送失败,我可以增加套接字发送缓冲区大小

时间:2012-10-05 15:14:16

标签: sockets

如果TCP套接字设置为非阻塞模式并且最初设置了套接字发送缓冲区, 然后send在循环中用于发送所有数据。如果由于EAGAIN错误导致发送失败,是否可以增加发送套接字缓冲区? 我正在使用Linux操作系统。我想了解是否允许调整sendbuffer大小的大小。在tcp man page上,“在单个连接上,必须在listen(2)或connect(2)调用之前设置套接字缓冲区大小才能使其生效。”这就是问题出现的原因

2 个答案:

答案 0 :(得分:3)

你可以尝试tuning the networking buffers但这可能不是一个好主意。无论你有多大的缓冲区,都会出现问题,因此你需要编写代码来处理这种情况。

答案 1 :(得分:2)

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

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

找出您的流量突发内存要求,预设套接字发送缓冲区大小,应用程序端的缓冲区。