2

在服务器端,在 readfds 上执行 select() 时,它返回错误的文件描述符错误。我怎样才能找到 fdset 中哪些 fd 变得无效?

4

2 回答 2

1

通常,当另一端的连接关闭或发送 RST 段时,select返回并将相应的描述符标记为准备好读取。当您随后从它们执行read/recv时,将返回错误或 EOF。

您也可以尝试使用strace工具(如果可用)进行调试。它将帮助您跟踪输入的描述符以及调用的select描述符read/ 。recv

于 2012-09-26T13:03:01.953 回答
0

您可以使用以下函数检查套接字上的未决错误:

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 所说,EBADF从返回select(2)通常表明编码草率,

于 2012-09-26T13:25:37.033 回答