gpt4 book ai didi

c++ - 使用 select() 检测套接字何时断开连接

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:42 24 4
gpt4 key购买 nike

我正在尝试检测客户端何时与 select() 函数断开连接。问题是,我不太了解 select() 是如何工作的。我正在使用以下代码,你能告诉我我做错了什么和/或如何检测客户端是否断开连接吗?我正在使用非阻塞套接字。

int Network::bytesAvailable()
{
long bytes = 0;

if(ioctl(this->sockfd, FIONREAD, &bytes) < 0)
{
printf("ERROR: Network:bytesAvailable: ioctl() call failed.\n");
return -1;
}

return bytes;
}

NetworkStatus Network::status()
{
struct timeval tv;
fd_set fd;
int result = 0;

tv.tv_sec = 5;
tv.tv_usec = 0;

FD_ZERO(&fd);
FD_SET(this->sockfd, &fd);

result = select(this->sockfd + 1, &fd, 0, 0, &tv);

if(result && !this->bytesAvailable())
{
return -1; // disconnected, I'm guessing this is definitely WRONG.
}
else if(result > 0 && FD_ISSET(this->sockfd, &fd))
{
return 1; // bytes available.
}
else if(!result)
{
return 0; // timeout
}

return -1; // select() call failed.
}

最佳答案

当套接字关闭时,它变为“可读”,但调用 recv 将返回 0 字节。使用 select 您可以知道何时可以读取套接字,然后在读取时如果 recv 返回 0 那么您就知道它已关闭。

您的评论“可用字节数”并不完全准确。可以从中读取套接字,但是,如果它已关闭,将没有可用字节。

else if(result > 0 && FD_ISSET(this->sockfd, &fd))
{
return 1; // bytes available.
}

在非阻塞套接字中,recv 将返回 -1 并将 errno 设置为 EWOULDBLOCK(或 EAGAIN ) 如果没有数据且套接字未关闭。

关于c++ - 使用 select() 检测套接字何时断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17817874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com