5

我正在使用非阻塞套接字(fd_setsselect函数)对服务器和客户端进行编程,一旦服务器关闭或关闭客户端套接字,客户端就会开始接收大量垃圾,直到崩溃。我在工作时被警告过当连接终止时,带有select()套接字的套接字将变得可读,但我怎么知道

if( FD_ISSET( socket, &read ) ) 
{
} 

如果原因只是常规数据或连接已结束?

十分感谢!

4

2 回答 2

6

文件描述符集不会告诉您套接字是否已关闭,只是您可能会尝试从中读取。当远程端关闭连接时,套接字将变为“可读”。当您尝试 a 时recv(),返回值将为 0,表示套接字已关闭。始终检查您的返回值。

于 2011-05-09T13:09:47.940 回答
0

您将不得不使用poll(它也更灵活,因为它不受 FD_SET 的大小的限制!)

struct poll p = {.fd = fd, .events = POLLHUP|POLLRDHUP};
于 2011-12-13T16:58:51.657 回答