我正在使用非阻塞套接字(
fd_sets
和select
函数)对服务器和客户端进行编程,一旦服务器关闭或关闭客户端套接字,客户端就会开始接收大量垃圾,直到崩溃。
我被警告说,当使用 select()
时,连接终止时套接字将变得可读,但我怎么知道
if( FD_ISSET( socket, &read ) )
{
}
如果原因只是常规数据或连接已终止?
非常感谢!
文件描述符集不会告诉您套接字是否已关闭,只会告诉您可以尝试从中读取数据。当远程端关闭连接时,套接字将变为“可读”。当您尝试
recv()
时,返回值将为 0,表示套接字已关闭。始终检查您的返回值。
你必须使用
poll
来代替(它也更灵活,因为它不受 FD_SET 大小的限制!)
struct poll p = {.fd = fd, .events = POLLHUP|POLLRDHUP};