Страница 1 из 2

Таймауты в сокетах

Добавлено: 23 июл 2004, 12:51
AiK
Subj собственно. SO_RCVTIMEO и SO_SNDTIMEO это конечно хорошо, но send и recv зависают крайне редко, особенно если буффер небольшой. Больше интересует как установить таймаут для gethostbyname и, особенно, для connect. Очень раздражают чуть ли не бесконечные зависания если сеть есть, но инета - нет или DNS сервер провайдера помер. Версия сокетов из последних 2.2

Кстати, паралелльный вопрос: каков оптимальный/рекомендуемый/дефолтный размер буффера для send?

P.S: с благодарностью приму ссылки на толковое описание принципов работы с WinSock.

Добавлено: 23 авг 2004, 14:11
Kolinus
не знаю как установить таймаут - сам в свое время искал - не нашел и сделал следующее - многопотоковость товарищи это будущее (благо железо позволяет).
Я все такие операции выносил в отдельный поток

Добавлено: 23 авг 2004, 14:30
AiK
Kolinus, многопоточность это хорошо, и, допустим, при помощи select я узнаю произошёл коннект или нет, и если нет, то завершу поток, который завис на connect. Но вот никак не могу взять в толк, как извратится подобным образом для операции gethostbyname?

Добавлено: 23 авг 2004, 17:57
Kolinus
А в чем собсно проблема?
создаешь поток который вызывает метод gethostbyname и завершает сам себя. если get.. вернула не NULL - сохраняет куда-то стуктуру.
если нет - то ничего

Добавлено: 23 авг 2004, 18:51
AiK
Kolinus, молодца! Только если DNS сервер не доступен, то gethostbyname ничего не возвращает ок 30 секунд. Что есть неприемлемо. Адназначна! :)

Добавлено: 24 авг 2004, 01:01
Kolinus
А ты уверен чт отебе без гетхостбайнейм ну никак не обойтись?
гетхостбайадресс например на вин2к ждет всего 8 секунд
и второе - а почему неприемлимо?? основная прога-то не подвиснет и будет на все реагировать - ну а тут коннект и коннект - ждите (даже прогрессбар можно нарисовать :) )

Добавлено: 24 авг 2004, 01:10
AiK
А ты уверен чт отебе без гетхостбайнейм ну никак не обойтись?
Угу. Почему-то сокет не создаётся по имени :) , а IP изменяется чаще, чем выходят изменения моей проги.
гетхостбайадресс например на вин2к ждет всего 8 секунд
Фигу. Если сетки нет совсем, то он таки да, около 5 секунд думает. А вот если сеть есть, но DNS сервер помер, то около 25-ти (+\- 5)секунд думает.
даже прогрессбар можно нарисовать
Не тот случай.

Полагаю, что придётся флажками обвешиваться.

Добавлено: 24 авг 2004, 12:59
Kolinus
Меня уже и цитируют - круто :D
Тогда еще два варианта - вариант номер 1 сделать еще один поток который будет убивать поток с гет... через нужное время.
Вариант номер зва - где-то в инете (coeproject.ru(com) sources.ru codeguru.ru(com)) я видел исходники утилитки ping - может они помогут - пинг -то вроде быстро работает

Добавлено: 24 авг 2004, 13:37
Kolinus
сорри - codeproject.ru(com)

Добавлено: 24 авг 2004, 15:46
AiK
Kolinus, ага - следующий совет взять исходники Mozilla, или в крайнем случае Firefox и посмотреть как люди делают. Тоже быстро работает :D