select 实现超时连接

int ConnectHasTimeout(SOCKET sock, const sockaddr *name, int namelen, int nsec)
{
 int n;
 int error = 0;
 unsigned long flag = 1;
 ioctlsocket(sock, FIONBIO, (unsigned long*)&flag);
 if ((n = connect(sock, name, namelen)) == SOCKET_ERROR)
 {
  if (WSAEINPROGRESS == WSAGetLastError())
  {
   return -1;
  }
 }

 do
 {
  if (0 == n)
  {
   break;
  }

  struct timeval tv;
  fd_set rset, wset;
  FD_ZERO(&rset);
  FD_SET(sock, &rset);
  wset = rset;
  tv.tv_sec = nsec;
  tv.tv_usec = 0;

  if ((n = select(0, &rset, &wset, 0, nsec ? &tv : NULL)) == 0)
  {
   closesocket(sock);
   WSASetLastError(WSAETIMEDOUT);
   return -1;
  }

  if (FD_ISSET(sock, &rset) || FD_ISSET(sock, &wset))
  {
   int len = sizeof(error);
   if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (char*)&error, &len) < 0)
   {
    return -1;
   }
  }
 }while (0);
 
 flag = 0;
 ioctlsocket(sock, FIONBIO, (unsigned long*)&flag);
 if (error)
 {
  closesocket(sock);
  return -1;
 }
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值