C 套接字:避免套接字关闭时产生垃圾

问题描述 投票:0回答:2

我正在使用非阻塞套接字(

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

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

如果原因只是常规数据或连接已终止?

非常感谢!

c sockets networking winsock2 posix-select
2个回答
6
投票

文件描述符集不会告诉您套接字是否已关闭,只会告诉您可以尝试从中读取数据。当远程端关闭连接时,套接字将变为“可读”。当您尝试

recv()
时,返回值将为 0,表示套接字已关闭。始终检查您的返回值。


0
投票

你必须使用

poll
来代替(它也更灵活,因为它不受 FD_SET 大小的限制!)

struct poll p = {.fd = fd, .events = POLLHUP|POLLRDHUP};
© www.soinside.com 2019 - 2024. All rights reserved.