现在的解决方法
// server端是否断开连接
bool is_server_disconnected(int client_socket)
{
// 非阻塞
set_flag(client_socket, O_NONBLOCK);
char buffer[10];
int length = recv(client_socket, buffer, 10, 0);
clr_flag(client_socket, O_NONBLOCK);
return length == 0;
}
把client_socket设置成了非阻塞,然后recv如果返回0了,说明remote socket is closed.
When a stream socket peer has performed an orderly shutdown, the
return value will be 0 (the traditional "end-of-file" return).
其他方法
tcp断开暂借不考虑,不知道有没有更简单更好的方法??
poll
man可以跳过系统缓冲区检测socket状态,并且可以轻松实现监管所有子线程。
POLLHUP
for 正常关闭POLLERR
for 程序挂了想要检测网线挂了的话只能发心跳包,
SO_KEEPALIVE
。