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)
- Форум И при передаче широко пакета получаю Access denied (2009)
- Форум Непонятки с сокетами (2006)
- Форум проблема с сокетами [C] (2009)
- Форум Получение списка интерфейсов через netlink (2013)