在服务器端,在readfds上执行select()时,它会返回错误的文件描述符错误。如何找到 fdset 中的哪个 fd 已失效?
通常,当另一端的连接关闭或发送 RST 段时,select
返回并将相应的描述符标记为准备读取。当您随后从它们执行read
/recv
时,将返回错误或EOF。
您也可以尝试使用strace
工具(如果可用)进行调试。它将帮助您跟踪提供给select
的描述符以及调用read
/recv
的描述符。
您可以使用以下函数检查套接字上的挂起错误:
int get_socket_error( int s ) {
int error;
socklen_t len = sizeof( error );
if ( getsockopt( s, SOL_SOCKET, SO_ERROR, &error, &len ) < 0 )
error = errno;
return error;
}
但正如@Maxim所说,从select(2)
返回EBADF
通常表明编码草率,