Tôi đang cố gắng phát hiện bất cứ khi nào máy khách bị ngắt kết nối với chức năng select(). Vấn đề là, tôi không hiểu nhiều về cách select() hoạt động. Tôi đang sử dụng mã sau đây, bạn có thể cho tôi biết những gì tôi đang làm sai và/hoặc làm thế nào để phát hiện nếu khách hàng bị ngắt kết nối? Tôi đang sử dụng ổ cắm không chặn.Phát hiện bất cứ khi nào ổ cắm bị ngắt kết nối bằng cách chọn()
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.
}
Nói chung, chúng tôi phát hiện, Cho dù kết nối có hoạt động không? bằng cách sử dụng 'keepalive' và' select() ', chúng tôi sử dụng cho ghép kênh. Có ** không ** đúng không? –
Tôi không hiểu ngữ pháp của bạn, xin lỗi :) – user2399415
Xin lỗi tiếng Anh của tôi rất kém: (nhưng tôi đã chỉnh sửa nhận xét, bây giờ tôi có hiểu không? –