int connect_nb(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen){
int flags, res, error;
socklen_t len;
struct pollfd p;
if((flags = fcntl(sockfd, F_GETFL, 0)) < 0)
{ syslog(LOG_ERR, "fcntl GETFL failed: %s", strerror(errno)); return -1; }
if(fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0)
{ syslog(LOG_ERR, "fcntl SETFL failed: %s", strerror(errno)); return -1; }
error = 0;
if((res = connect(sockfd, serv_addr, addrlen)) < 0) if(errno!=EINPROGRESS)return -1;
if(res == 0) { /* connect completed immediately (usually localhost) */
if(fcntl(sockfd, F_SETFL, flags) < 0)
{ syslog(LOG_ERR, "fcntl reSETFL failed: %s", strerror(errno)); return -1; }
return 0;
}
memset(&p, 0, sizeof(p));
p.fd = sockfd;
p.events = POLLOUT;
if((res = poll(&p, 1, SERVER_TO * 1000)) != 1) {
if(res == 0) { errno = ETIMEDOUT; } /* timeout */
return -1;
}
/* socket is writeable == operation completed */
len = sizeof(error);
if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)
{ syslog(LOG_ERR, "getsockopt failed: %s", strerror(errno)); return -1; }
if(fcntl(sockfd, F_SETFL, flags) < 0) /* restore file status flags */
{ syslog(LOG_ERR, "fcntl reSETFL failed: %s", strerror(errno)); return -1; }
if(error){ errno = error; return -1; } /* getsockopt() shows an error */
/* really connected */
return 0;
} 
Ответ на:
комментарий
от klalafuda
Ответ на:
комментарий
от klalafuda

Ответ на:
комментарий
от cvv
Ответ на:
комментарий
от Onanim

Ответ на:
комментарий
от klalafuda
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум connect return -1 errno = 105 (ENOBUFS) (2005)
- Форум В чем ошибка чтения? (2020)
- Форум Помогите найти ошибку в следующем коде!!! (2004)
- Форум 2014-11-17T23:34:13+00:00 kern infoblox kernel[]: info [ 2032.012246] your_daemon forgot to set AF_INET in raw sendmsg. Fix it! (2014)
- Форум не биндится сокет к 80 порту (2017)
- Форум Соединится с сервером по сокету? (2020)
- Форум Непонятки с сокетами (2006)
- Форум И при передаче широко пакета получаю Access denied (2009)
- Форум проблема с сокетами [C] (2009)
- Форум Получение списка интерфейсов через netlink (2013)