1.建立socket2.將該socket設置為非阻塞模式3.調用connect()4.使用select()檢查該socket描述符是否可寫(注意,是可寫)5.根據select()返回的結果判斷connect()結果6.將socket設置為阻塞模式(如果你的程序不需要用阻塞模式的,這步就省了,一般情況下都是用阻塞模式的)
#include #include #define TIME_OUT_TIME 20 //connect超時時間20秒int main(int argc , char **argv){………………int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd < 0) exit(1);struct sockaddr_in serv_addr;………//以服務器地址填充結構serv_addrint error=-1, len;len = sizeof(int);timeval tm;fd_set set;unsigned long ul = 1;ioctl(sockfd, FIONBIO, &ul); //設置為非阻塞模式bool ret = false;if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1){tm.tv_set = TIME_OUT_TIME;tm.tv_uset = 0;FD_ZERO(&set);FD_SET(sockfd, &set);if( select(sockfd+1, NULL, &set, NULL, &tm) > 0){getsockopt(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(sockfd, FIONBIO, &ul); //設置為阻塞模式if(!ret){close( sockfd );fPRintf(stderr , "Cannot Connect the server!n");return;}fprintf( stderr , "Connected!n");//下面還可以進行發包收包操作
}
新聞熱點
疑難解答