Nice_hanyu

导航

客户端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)    收藏  举报