PDA

Просмотр полной версии : Таймауты в сокетах



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

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

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

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

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

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

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

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

AiK
24.08.2004, 01:10
А ты уверен чт отебе без гетхостбайнейм ну никак не обойтись?
Угу. Почему-то сокет не создаётся по имени :), а IP изменяется чаще, чем выходят изменения моей проги.

гетхостбайадресс например на вин2к ждет всего 8 секунд
Фигу. Если сетки нет совсем, то он таки да, около 5 секунд думает. А вот если сеть есть, но DNS сервер помер, то около 25-ти (+\- 5)секунд думает.

даже прогрессбар можно нарисовать
Не тот случай.

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

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

Kolinus
24.08.2004, 13:37
сорри - codeproject.ru(com)

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

Kolinus
24.08.2004, 16:31
Я понимаю - можно и паровозом дверь открывать - вместе с косяком.
Но про пинг - я серьезно - там сырцов-то кил 10 максимум будет
по -моему я все-таки видел на codeguru.com в разделе Visual С++