2

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

4

2 回答 2

3

您可以尝试调整网络缓冲区,但这可能不是一个好主意。无论您拥有多大大小的缓冲区,问题都可能发生,因此您需要编写代码来处理这种情况。

于 2012-10-05T15:27:55.720 回答
2

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

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

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

于 2012-10-05T15:43:55.810 回答