多路复用非阻塞套接字 IOs 与 EOF

Multiplexing non-blocking socket IOs with EOF

我正在使用 linux select 实现非阻塞套接字 IO 反应器。比方说,服务器和客户端正在通信。如果客户端或服务器宕机,另一端应该收到一个 EOF,这可以通过 read 调用(C 函数调用)的 return 值来判断。

if(read(fd, ...) == 0) { printf("Endpoint connection failed\n"); }

我的问题是,此 EOF 事件是否会与读取的其他数据重叠或合并?例如,客户端向服务器发送1 byte,不小心立即关机。如果它们发生的时间非常接近,服务器上的 read 是否仍可与 1 byteEOF 分开?

EOS 将在任何待处理数据之后交付。

如果另一端发送一个字节然后关闭连接,那么你将首先读取一个字节,然后next调用read将return0.

单个 read 调用无法同时执行这两项操作 - 因为它必须 return 0 表示关闭,如果它读取一些数据则必须为非 0。