select () тайм-аут 3 с, даже на ICMP-порт недоступен - PullRequest
2 голосов
/ 27 апреля 2011

Когда я пытаюсь подключиться к серверу с неблокирующим сокетом (чтобы я мог использовать select () с параметром тайм-аута), я понял, что при подключении к порту, который заблокирован iptables с -j, ОТКЛОНИТЬ select() ожидает до параметра timeout, но не более 3 с ... не имеет значения, что недостижимый пакет порта ICMP действительно быстрый.

fcntl(sockfd, F_SETFL, O_NONBLOCK);
connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr));
if (select(sockfd + 1, NULL, &fdset, NULL, NULL) == 1) {...}

В приведенном выше примере select () блокируется до3 с, если соединение идет к localhost: 1234 и порт заблокирован, как описано выше.

Кто-нибудь знает, почему этот тайм-аут 3 с для получения «соединения отказано»?Как я могу настроить его (потому что я получил ICMP-порт, недоступный после 0,02 мс)?

1 Ответ

1 голос
/ 27 апреля 2011

Сокет станет «доступным для записи» только в случае успеха connect. Если вы также хотите, чтобы select возвращался при сбое, вы должны также проверить наличие «ошибки / исключительного» условия в сокете, то есть передать набор в качестве третьего fd_set * аргумента в select.

...