情境:
在客户端和服务器之间建立连接。客户端连接关闭,客户端被破坏。在服务器端,检测到一些连接被关闭但有些连接没有。所以有套接字描述符就像悬空指针。选择这些返回错误的文件描述符错误,但是找不到无效的fd。
问题:
在上面的场景中,客户端连接不存在,我应该如何处理这些BAD FILE DESCRIPTORs
。我可以在这些上调用recv()
吗?
答案 0 :(得分: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
之前检测到不同的错误情况)。
答案 1 :(得分:1)
我相信你搞砸了不同的情况。
如果在客户端关闭连接,并且在服务器端套接字上调用select(),则会触发FD_READ并且recv()将返回零,然后您可以在服务器端关闭套接字。
如果连接丢失且服务器没有收到FIN信号,则需要在客户端和服务器之间以及每个服务器端套接字上的计时器之间检测心跳,以检测TCP半开状态。
"错误的文件描述符"只有在已经关闭的套接字上调用API时才会出现错误。