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

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Eugie, Romeo, Hawk

Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

23 июл 2004, 12:51

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

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

P.S: с благодарностью приму ссылки на толковое описание принципов работы с WinSock.
Даже самый дурацкий замысел можно воплотить мастерски
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

23 авг 2004, 14:11

не знаю как установить таймаут - сам в свое время искал - не нашел и сделал следующее - многопотоковость товарищи это будущее (благо железо позволяет).
Я все такие операции выносил в отдельный поток
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

23 авг 2004, 14:30

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

23 авг 2004, 17:57

А в чем собсно проблема?
создаешь поток который вызывает метод gethostbyname и завершает сам себя. если get.. вернула не NULL - сохраняет куда-то стуктуру.
если нет - то ничего
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

23 авг 2004, 18:51

Kolinus, молодца! Только если DNS сервер не доступен, то gethostbyname ничего не возвращает ок 30 секунд. Что есть неприемлемо. Адназначна! :)
Даже самый дурацкий замысел можно воплотить мастерски
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

24 авг 2004, 01:01

А ты уверен чт отебе без гетхостбайнейм ну никак не обойтись?
гетхостбайадресс например на вин2к ждет всего 8 секунд
и второе - а почему неприемлимо?? основная прога-то не подвиснет и будет на все реагировать - ну а тут коннект и коннект - ждите (даже прогрессбар можно нарисовать :) )
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

24 авг 2004, 01:10

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

Полагаю, что придётся флажками обвешиваться.
Даже самый дурацкий замысел можно воплотить мастерски
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

24 авг 2004, 12:59

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

24 авг 2004, 13:37

сорри - codeproject.ru(com)
В SAD - все в SAD.
Аватара пользователя
AiK
Сообщения: 2271
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

24 авг 2004, 15:46

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