网络tcp 断线情况
select 后的socket连接一下:
0.正常发送
如:fd = 57;5 = send(fd,"hello",5,0);
strerror(0) = Success
1.任何一方close,对方的recv都会马上到消息,并返回0.
2.send 一个已经close的fd 会返回-1;
如:fd = 57; close(fd); -1 = send(fd,"hello",5,0);
strerror(9) = Bad file descriptor
3.send一个无效的fd. 返回-1;
如:fd = -1; -1 = send(fd,"hello",5,0);
strerror(9) = Bad file descriptor
4.如果
fd = -1;
select(fd + 1, NULL, &writefds, NULL, &tm_out);
// fd = -1; 放到这里也是一样的。
//测试指定句柄是否可以操作
if(FD_ISSET(fd, &writefds))
{
//进不来。
}
5.客户端如果更新IP(不会显示任何一方断开连接,只会认为网络状态不良),正在send的send函数会阻塞
select 超时设置会失效,使用SO_SNDTIMEO就会有效果,就在阻塞的send使用SO_SNDTIMEO的timeout时间
{返回已经发送的字节数,如需发1024,超时后返回了800}
之后用回select的timout时间。
tv_out.tv_sec = m_SendTimeOut / 1000;
tv_out.tv_usec = (m_SendTimeOut % 1000) * 1000;
//设置发送超时
setsockopt(m_ConnectFd, SOL_SOCKET, SO_SNDTIMEO, (char*)&tv_out, sizeof(tv_out));