如何查找哪个套接字描述符在 fdset 中变得无效



在服务器端,在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通常表明编码草率,

最新更新