Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Timeout для connect (Linux, C++)

41K
23 марта 2012 года
Govard
28 / / 26.10.2011
Всем привет!
Ради тренировки написал штуку, которая рассчитывает IP между двумя введенными, и проверяет возможность подключения к ним на определенном порту. Например так:
 
Код:
# proga 127.0.0.1 127.0.0.10 80
Полученные IP пишутся в массив
 
Код:
char * ipbuff[total];
Далее идет выбор: сканировать или же просто вывести на экран.

Вот, что я сделал:
Код:
int main( ... ) {
...
    int sock[total];
    int conn[total];
    struct sockaddr_in addr[total];
   
    for ( int si = 0; si < total; si++)
    {
        sock[si] = socket(AF_INET, SOCK_STREAM, 0);
        if ( sock[si] < 0 ) {
            perror("socket");
            exit(3);
        }
       
        memset(&addr[si], 0, sizeof(addr[si]));
        addr[si].sin_family = AF_INET;
        addr[si].sin_port = htons(n_connect_port);
        addr[si].sin_addr.s_addr = inet_addr(ipbuff[si]);
       
        conn[si] = connect(sock[si], (struct sockaddr *)&addr[si], sizeof(addr[si]));
       
        if ( conn[si] < 0 ) {
            cout << ipbuff[si] << ":" << n_connect_port << "     ...     Fail!" << endl;
        } else {
            cout << ipbuff[si] << ":" << n_connect_port << "     ...     Ok!" << endl;
        }
       
        close (sock[si]);
    }
...
}
Не знаю, может я делаю чушь, но это работает. Однако проблема в таймауте. Если порт какого-то IP недоступен, то connect долго-долго ждет ответа. В итоге, программа выполняется очень долго. Значит, для функции connect нужно как-то обозначить таймаут (пусть 5 секунд). Если 5 секунд вышли, то переходить к следующему пункту. Собственно, как это сделать? Если можно, то пример. Я не прошу за меня писать, а просто пример реализации. Да и вообще, может такой вариант проверки - бред и как-то иначе можно реализовать? Платформа: Linux.

Заранее благодарю!
316
24 марта 2012 года
Alm3n
889 / / 29.05.2009
Например, подключаться к сокету в другом потоке. Но это не обязательно.
Вообще, man connect. Там должно быть что-то про
Цитата:

EINPROGRESS
The socket is non-blocking and the connection cannot be completed immedi-
ately. It is possible to select(2) or poll(2) for completion by selecting
the socket for writing. After select(2) indicates writability, use getsock-
opt(2) to read the SO_ERROR option at level SOL_SOCKET to determine whether
connect() completed successfully (SO_ERROR is zero) or unsuccessfully
(SO_ERROR is one of the usual error codes listed here, explaining the reason


И почитать про неблокируемые сокеты хотя бы приблизительно, например, тут.
Думаю, этого хватит, если только про таймер ещё почитать, например, тут, ну или где попонятней будет.

41K
24 марта 2012 года
Govard
28 / / 26.10.2011
Спасибо! В сторону таймера пока покопаю.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог