2

场景:
客户端和服务器之间建立连接。客户端连接关闭,客户端被销毁。在服务器端,检测到一些已关闭的连接,但有些没有。因此存在类似于悬空指针的套接字描述符。在这些上选择会返回 Bad file descriptor 错误,但无法找到无效的 fd 。

问题: 在上述情况下,客户端连接不存在我应该如何处理这些BAD FILE DESCRIPTORs。我可以调用recv()这些吗?

4

2 回答 2

1

的签名select()是:

int select(int nfds, fd_set *restrict readfds,
           fd_set *restrict writefds, fd_set *restrict errorfds,
           struct timeval *restrict timeout);

该集合是否没有errorfds为您提供生成错误条件的描述符列表,例如EBADF

您可以调用recv()或使用带有错误文件描述符的文件描述符的任何其他函数;您可能会EBADF从调用的函数中返回错误(除非它在检测之前检测到不同的错误条件EBADF)。

于 2012-10-11T11:45:31.590 回答
1

我相信你搞砸了不同的情况。

如果连接在客户端关闭,并且您在服务器端套接字上调用 select(),FD_READ 将被触发并且 recv() 将返回零,那么您可以在服务器端关闭套接字。

如果连接丢失并且服务器没有收到 FIN 信号,则需要在客户端和服务器之间有心跳以及每个服务器端套接字上的计时器来检测 TCP 半打开情况。

仅当您在已关闭的套接字上调用 API 时才会发生“错误文件描述符”错误。

于 2012-10-11T13:55:59.633 回答