客户端select+recv+keepalive的联合使用。
一 设置this->TcpSetKeepAlive(20); //20s测试时间
『
BOOL ××类::TcpSetKeepAlive(INT nKeepIdle) {
//激活KEEPALIVE
BOOL bKeepAlive = TRUE;
int nRet = ::setsockopt(m_sockClient, SOL_SOCKET, SO_KEEPALIVE, (char*)&bKeepAlive, sizeof(bKeepAlive));
if (nRet == SOCKET_ERROR)
{
return FALSE;
}
//设置参数
tcp_keepalive alive_in = {0};
tcp_keepalive alive_out = {0};
alive_in.keepalivetime = nKeepIdle * 1000; // 开始首次KeepAlive探测前的TCP空闭时间
alive_in.keepaliveinterval = (nKeepIdle * 1000) / 4; // 两次KeepAlive探测间的时间间隔
alive_in.onoff = TRUE;
unsigned long ulBytesReturn = 0;
nRet = WSAIoctl(m_sockClient, SIO_KEEPALIVE_VALS, &alive_in, sizeof(alive_in),
&alive_out, sizeof(alive_out), &ulBytesReturn, NULL, NULL);
if (nRet == SOCKET_ERROR)
{
return FALSE;
}
return TRUE;
}
』
二 if(nRetSelect=select(m_sockClient+1,&s_set,NULL,NULL,&tval))
看是否能够接收, 其中select的返回值:
//select 断网 |有数据: return 1
// 没断网|没数据: return 0
三 while(nRecvLength=recv(m_sockClient,Buf+nRecvLengthAdd,SRBUF_LENGTH-nRecvLengthAdd,0))
循环接收,一定时间内收不到,则提示断网了,进入线程,重新发送,并且减缓发送速度。
PS:以上过程均需设置在线程内,避免卡机,便于设置重发时间减缓。
posted on 2013-04-08 10:16 Nice_hanyu 阅读(575) 评论(0) 收藏 举报
浙公网安备 33010602011771号