• tcp中设置连接超时


    直接上代码:

    设置连接超时

    //首先改成非阻塞套接字
    
    unsigned long ul=1;
    int rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul); 
    if(rm==-1)
    {
      printf("ioctl noblock error!
    ");
      close(sConnect); 
      return -3; 
    }
    
    //向服务器发出连接请求 
    int err = connect(sConnect, (struct sockaddr*)&addrServer, sizeof(addrServer));
    
    //正常返回EINPROGRESS
    
    if(err && errno!=EINPROGRESS) 
    {
      printf("cannot connect:%s
    ",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
    ");
                return -5;
            }
            else if(retval == 0)
            {
                printf("connect timeout
    ");
                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
    ");
                    return -8;
                }
                if (er != 0) {
                    //connect()失败,进行错处理
                    printf("connect error
    ");
                    return -9;
                }
            }
    }
    //改为阻塞 ul
    =0; rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul); if(rm==-1) { printf("ioctl block error! "); close(sConnect); return -7; }

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

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

           二者还是有点区别的。

  • 相关阅读:
    AngularJs学习笔记--directive
    angularjs 路由(1)
    走进AngularJs(一)angular基本概念的认识与实战
    angularjs- 快速入门
    从angularJS看MVVM
    中软国际 问题一php的优缺点
    elasticsearch head安装后无法连接到es服务器问题
    Laravel5.3 流程粗粒度分析之bootstrap
    mysql执行大量sql语句
    Laravel RuntimeException inEncrypter.php line 43: The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths
  • 原文地址:https://www.cnblogs.com/bigfi/p/7389810.html
Copyright © 2020-2023  润新知