int flag; flag = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flag | O_NONBLOCK); start_time = time(NULL); int ret = connect(sockfd, (struct sockaddr*)&addr, sizeof(addr)); if(ret == -1) { if(errno == EAGAIN || errno == EINPROGRESS) { struct timeval t; fd_set rset, wset; FD_ZERO(&rset); FD_SET(sockfd, &rset); wset = rset; t.tv_sec = timeout; t.tv_usec = 0; ret = select(sockfd+1, &rset, &wset, NULL, &t); if(ret == -1) { printf("select fail, %s/n", strerror(errno)); goto END; }else if(ret == 0) { printf("select timeout, connect fail./n"); goto END; }else { int err = 0; socklen_t len = sizeof(int); if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &err, &len) < 0 || err!=0) { printf("socket connection fail, %s/n", strerror(err)); goto END; } } }else { time_t cur = time(NULL); printf("connect function return fail, %s/n", strerror(errno)); goto END; } } end_time = time(NULL);