URL:http://kldp.org/node/91616
int connect_nonb(int sockfd, const struct sockaddr *saptr, socklen_t salen, int nsec)
{
int flags, status, error;
socklen_t len;
fd_set rset, wset;
struct timeval tval;
int fd_max;
flags = fcntl(sockfd, F_GETFL, 0);
if (fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0)
{
printf("[Error] Non block mode set fail !\n");
return -1;
}
error = 0;
printf("[INFO] connect function load\n");
status = connect(sockfd, (struct sockaddr *)saptr, salen);
if ((status < 0) && (error == EINPROGRESS))
{
printf("[INFO] connection fail !!\n");
return(-1);
}
/* Do whatever we want while the connect is taking place. */
if (status == 0)
goto done; /* connect completed immediately */
FD_ZERO (&rset);
FD_SET (sockfd, &rset);
wset = rset;
tval.tv_sec = nsec;
tval.tv_usec = 0;
printf("[INFO] select function load\n");
if ((status = select(sockfd + 1, &rset, &wset, NULL, nsec ? & tval : NULL)) == 0) {
printf("[INFO] select return time out\n");
close(sockfd);
error = ETIMEDOUT;
return (-1);
}
if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) {
len = sizeof(error);
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
return (-1);
} else {
printf("[Error] select error: sockfd not set\n");
return (-1);
}
done:
fcntl(sockfd, F_SETFL, flags); /* restore file status flags */
if (error) {
printf("[Error] socket error\n");
close(sockfd); /* just in case */
return(-1);
}
printf("[Info] nonb connection complete !! \n");
return(0);
}