当写入无法在设备 tx 环中排队时,TCP 会发生什么情况?

当写入无法在设备 tx 环中排队时,TCP 会发生什么情况?

假设设备 tx 环已满,并且您执行正常的 C 非阻塞写入(fd,buff)以将数据排入 TCP SND 缓冲区中。

当此操作失败时会发生什么?在 UDP 中——数据包会被丢弃,但在 TCP 中会发生什么?

这是上下文:

我有一个测试仪,它以非阻塞方式按顺序将数据发送到一堆 TCP 套接字。它发送足够的数据来填充 SND BUFF。

我测试的条件是填充SND BUFF后;对于 500 个连接中的少数几个,我在几秒钟内不会收到来自非阻塞轮询的 OPS_WRITE 事件。有时我会在长达 2-3 秒的时间里从民意调查中得到一无所获。

我将 TX RING 从 512 增加到 2048,现在除非网卡达到容量 10 秒或更长时间,否则这种情况永远不会发生。

答案1

写(2),

错误

      ⋮

伊加恩或者伊沃德布洛克

    文件描述符FD指的是一个套接字并且已被标记为非阻塞(O_非阻塞),并且写入会阻塞。 POSIX.1-2001 允许在这种情况下返回任一错误,并且不要求这些常量具有相同的值,因此可移植应用程序应检查这两种可能性。

换句话说,write将返回 -1,errno设置为EAGAINEWOULDBLOCK。(当然,缓冲区中的数据不会被发送。)

相关内容