tcp中设置连接超时

直接上代码:

设置连接超时

//首先改成非阻塞套接字

unsigned long ul=1;
int rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul); 
if(rm==-1)
{
  printf("ioctl noblock error!\n");
  close(sConnect); 
  return -3; 
}

//向服务器发出连接请求 
int err = connect(sConnect, (struct sockaddr*)&addrServer, sizeof(addrServer));

//正常返回EINPROGRESS

if(err && errno!=EINPROGRESS) 
{
  printf("cannot connect:%s\n",severAgent);
  return -4;
}

//有可能返回0
if (err==0)
{
  printf("connect suceess!");
}

else
{
        struct timeval tv; 
        fd_set /*r,*/w;          
//      FD_ZERO(&r);
        FD_ZERO(&w);
//      FD_SET(sConnect,&r); 
        FD_SET(sConnect,&w); 
        tv.tv_sec=m_conTimeout;    
        tv.tv_usec=0;
        int retval = select(sConnect+1,0,&w,0,&tv);
        if(retval==-1)
        {
            printf("select error\n");
            return -5;
        }
        else if(retval == 0)
        {
            printf("connect timeout\n");
            return -6;
        }
        else
        {
            int er;
            socklen_t len = sizeof(er);
            if (getsockopt(sConnect, SOL_SOCKET, SO_ERROR, (char *)&er, &len) < 0) {
                //getsockopt()失败,进行错处理
                printf("getsockopt error\n");
                return -8;
            }
            if (er != 0) {
                //connect()失败,进行错处理
                printf("connect error\n");
                return -9;
            }
        }
}
//改为阻塞 ul
=0; rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul); if(rm==-1) { printf("ioctl block error!\n"); close(sConnect); return -7; }

 值得注意的是:linux中,如果服务器的地址无效,则以上超时过程正常。如果服务器地址有效,但是服务程序未开启,则直接返回错误,也就是说超时过程不起作用,说明是已经做了目标网络检测了。

       但是window中,同样是以上的代码,如果服务器的地址无效,则以上超时过程正常。如果服务器地址有效,但是服务程序未开,以上超时过程也是正常的。

       二者还是有点区别的。

 

posted @ 2017-08-18 15:14  bigfi  阅读(8817)  评论(0编辑  收藏  举报