TCP UDP select超时总结

UDP的recvfrom超时:

fd_set ReadSet;

FD_ZERO(&ReadSet);
 FD_SET(sockEncoder,&ReadSet);
 timeout.tv_sec = 1;
 timeout.tv_usec = 0;

 ret = select(0, &ReadSet, NULL, NULL, &timeout);
 if(ret>0)
 {
  ret = recv(sockEncoder, buf, sizeof(buf), 0);
  if(0 > ret)

 {
   cout<<"SendToEncoder() "<<"System Error: recv from encoder"<<", error-"<<GetLastError()<<endl;
   closesocket(sockEncoder);
   return FALSE;
  }
  if(0 == ret)

 {
   cout<<"SendToEncoder() "<<"recv from encoder"<<" timeout"<<endl;
   return FALSE;
  }

 

 

TCP connect 超时:

//使不阻塞在connect
 unsigned long ul = 1;
 ioctlsocket(sockEncoder, FIONBIO, &ul);  //设置为非阻塞模式

 bool suc = false;
 timeval tm;
 fd_set set;
 char error;
 int len = sizeof(char);
 if(connect(sockEncoder, (sockaddr*)&encoderAddr, sizeof(sockaddr)) == -1)
 {
  tm.tv_sec  = 3;
  tm.tv_usec = 0;
  FD_ZERO(&set);
  FD_SET(sockEncoder, &set);
  if( select(sockEncoder+1, NULL, &set, NULL, &tm) > 0)//是否可写
  {
   getsockopt(sockEncoder,SOL_SOCKET,SO_ERROR,&error,&len);
   if(error == 0)
    suc = true;//correct IP
   else
    suc = false;
  }
  else
   suc = false;//wrong IP after time_out
 }
 else
  suc = true;

 ul = 0;
 ioctlsocket(sockEncoder, FIONBIO, &ul);  //设置为阻塞模式
 if(!suc)
 {
  closesocket( sockEncoder );
  return FALSE;
 }
 //下面进行发包收包操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值