多路复用非阻塞套接字 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 byte
和 EOF
分开?
EOS 将在任何待处理数据之后交付。
如果另一端发送一个字节然后关闭连接,那么你将首先读取一个字节,然后next调用read
将return0.
单个 read
调用无法同时执行这两项操作 - 因为它必须 return 0 表示关闭,如果它读取一些数据则必须为非 0。
我正在使用 linux select
实现非阻塞套接字 IO 反应器。比方说,服务器和客户端正在通信。如果客户端或服务器宕机,另一端应该收到一个 EOF
,这可以通过 read
调用(C 函数调用)的 return 值来判断。
if(read(fd, ...) == 0) { printf("Endpoint connection failed\n"); }
我的问题是,此 EOF
事件是否会与读取的其他数据重叠或合并?例如,客户端向服务器发送1 byte
,不小心立即关机。如果它们发生的时间非常接近,服务器上的 read
是否仍可与 1 byte
和 EOF
分开?
EOS 将在任何待处理数据之后交付。
如果另一端发送一个字节然后关闭连接,那么你将首先读取一个字节,然后next调用read
将return0.
单个 read
调用无法同时执行这两项操作 - 因为它必须 return 0 表示关闭,如果它读取一些数据则必须为非 0。