我試圖檢測客戶端與select()函數斷開連接時。問題是,我不太瞭解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.
}
一般我們檢測到,無論連接是否存活?使用'keepalive'和'select()'我們用於複用。它不是**正確嗎? –
我不明白你的語法,對不起:) – user2399415
對不起我的英文很差:(但我編輯過評論,我現在明白了嗎? –