假设设备 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
设置为EAGAIN
或EWOULDBLOCK
。(当然,缓冲区中的数据不会被发送。)