zoukankan      html  css  js  c++  java
  • 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中,同样是以上的代码,如果服务器的地址无效,则以上超时过程正常。如果服务器地址有效,但是服务程序未开,以上超时过程也是正常的。

           二者还是有点区别的。

  • 相关阅读:
    POJ--3164--Command Network【朱刘算法】最小树形图
    金典 SQL笔记(6)
    hdoj1106排序
    linux程序设计——运行SQL语句(第八章)
    iOS-UITextView-文本输入视图的使用
    HDU 5305 Friends(简单DFS)
    Android IntentService全然解析 当Service遇到Handler
    概要设计的要点
    DispatcherTimer
    原型模式
  • 原文地址:https://www.cnblogs.com/bigfi/p/7389810.html
Copyright © 2011-2022 走看看