0
点赞
收藏
分享

微信扫一扫

connect超时时间过长


connect连接时如果跨网段会造成超时,这样会阻塞当前,如果是带GUI的,则会卡住程序,
这样有2种解决方法:
1.用多线程,将连接放在线程中去处理,这样要等也没关系

2.但是实际上还可以设置非阻塞,然后select,这样也会卡,但是这个卡的时间可以自己去设定,那么卡2,3秒是可以满足目前的需求的
#define CONNECT_TIME_OUT 3

timeval tm;
    fd_set set;
    unsigned long ul = 1;
    ioctl(m_sockfd, FIONBIO, &ul); //设置为非阻塞模式
    int len = sizeof(int);
    bool ret = false;
    int error = -1;
    if( connect(m_sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
    {
        tm.tv_sec = CONNECT_TIME_OUT;
        tm.tv_usec = 0;
        FD_ZERO(&set);
        FD_SET(m_sockfd, &set);
        if( select(m_sockfd+1, NULL, &set, NULL, &tm) > 0)
        {
            getsockopt(m_sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);
            if(error == 0){
                ret = true;
            }else{
                ret = false;
            }
        }else
        {
            ret = false;
        }
    }else{
        ret = true;
    }
    ul = 0;
    ioctl(m_sockfd, FIONBIO, &ul); //设置为阻塞模式
    if(!ret)
    {
        tcp_close();
        return -1;
    }



这里有一些别的解决方案和一些需要注意的


http://www.cnitblog.com/zouzheng/archive/2010/11/25/71711.html


举报

相关推荐

0 条评论