設置connect超時時間

socket編程中,當客戶端connect()連接一個服務端時,如果網絡或服務端繁忙,connect()函數會遲遲不會返回(阻塞模式下)。這裏有個方法,可以設置如果在給定的時間內還沒有連接上,就不在連接。

1、設置socket爲非阻塞模式

2、connect()連接

3、如果出錯,用select()系統調用對其進行超時檢測,看在給定的時間內socket是否變得可寫

    int fd = socket(PF_INET,SOCK_STREAM,0);
    ...
    int flags = fcntl(fd,F_GETFL,0);
    fcntl(fd,F_SETFL,flags | O_NONBLOCK);
    int n = connect(fd,(struct sockaddr*)&addr,sizeof addr);
    if(n < 0)
    {  // EINPROGRESS表示connect正在嘗試連接
        if(errno != EINPROGRESS && errno != EWOULDBLOCK)
            return 1;

        struct timeval tv;
        tv.tv_sec = 10;
        tv.tv_usec = 0;
        fd_set wset;
        FD_ZERO(&wset);
        FD_SET(fd,&wset);
        n = select(fd+1,NULL,&wset,NULL,&tv);
        if(n < 0)
        { // select出錯
            perror("select()");
            close(fd);
            return 1;
        }
        else if (0 == n)
        { // 超時
            cerr<< "Timeout." << endl;
            close(fd);
            return 1;
        }
        else
        {  // 連接成功
            cerr << "Connectd." <<endl;
        }
    }

    fcntl(fd,F_SETFL,flags & ~O_NONBLOCK);  // 設爲阻塞模式


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章