Тайм-аут соединения - PullRequest
       25

Тайм-аут соединения

2 голосов
/ 12 ноября 2008

Есть ли способ в среде Win32 "настроить" тайм-аут на вызов сокета connect()? В частности, я хотел бы увеличить продолжительность тайм-аута. Используемые розетки не блокируются. Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 ноября 2008

Да, это возможно.

Если вы находитесь в неблокирующем режиме после connect(), вы обычно используете select() для ожидания готовности ввода / вывода. Эта функция имеет параметр для указания значения тайм-аута и вернет 0 в случае тайм-аута.

0 голосов
/ 09 октября 2013

Нет, это невозможно. Время ожидания подключения по умолчанию может быть уменьшено, но не увеличено.

0 голосов
/ 26 марта 2012

Вы можете попробовать использовать параметры сокетов SO_RCVTIMEO и SO_SNDTIMEO, чтобы установить тайм-ауты для любых операций сокетов. Пример:

struct timeval timeout;      
timeout.tv_sec = 10;
timeout.tv_usec = 0;

if (setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,
            sizeof(timeout)) < 0)
    error("setsockopt failed\n");

if (setsockopt (sockfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout,
            sizeof(timeout)) < 0)
    error("setsockopt failed\n");

Вы также можете попробовать будильник (). Пример:

signal( SIGALRM, connect_alarm ); /* connect_alarm is you signal handler */
alarm( secs ); /* secs is your timeout in seconds */
if ( connect( fd, addr, addrlen ) < 0 )
{
    if ( errno == EINTR ) /* timeout, do something below */
        ...
}
alarm( 0 ); /* cancel the alarm */
...