|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
22.07.2012, 15:20 | #1 |
DI HALT RET
Форумчанин
Регистрация: 30.12.2010
Сообщений: 117
|
Добрый день. Столкнулся с такой проблемой. Опрашиваю через сокеты более 1000 устройств на открытый порт (23). Если открыт, то беру нужную инфу, если закрыт то в логи записываю, что устройство недоступно. Но если оно не доступно, то connect висит 15 сек, а мне на опрос необходимо потратить не более 5 сек или до устройства потери (в локалке). На каждое устройство создается своя нить, т.е. опрашиваются они одновременно.
Гугл перерыл. Не могу найти timeout на connect. Нашел только select на send и recv, но до них же приконнектится надо. Помогите найти решение, люди добрые, пожалуйста. Спасибо. Нашел ответ. Перед вызовом блокируем сокет с помощью ioctlsocket. Далее вызываем connect. Далее установка тайма: Код:
1 - коннект установился Вот код. Только до коннекта. В общем то пишу для себя, но думаю пригодится. Не забыл и ссылку, откуда взял инфу. Код:
Последний раз редактировалось Stilet; 22.07.2012 в 17:34. |
22.07.2012, 17:51 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
select работает и с сокетами, которые находятся в состонии connect-a - по завершению connect сокет будет доступен для записи (ну или соотственно ошибочка будет), так что не надо блокировать сокет. Таймаут в принципе можно задать но как он будет работать все на милость того, кто сделал TCP стек. Легче самому подождать какоето время, после наступления которого закрыть сокеты, которые не законектились.
|
22.07.2012, 20:30 | #3 |
Форумчанин
Регистрация: 11.01.2012
Сообщений: 177
|
рекомендую использовать WSAConnect и все подобные ей WSA-функции. в MSDN всё подробно задокументировано. они всё сразу сделано так что можно их использовать как асинхронные функции
progromore.i2p - первый русскоязычный портал программистов в скрытосети
|
23.07.2012, 10:01 | #4 |
DI HALT RET
Форумчанин
Регистрация: 30.12.2010
Сообщений: 117
|
Для WSAConnect нужен обработчик. Мне же необходима линейность.
waleri, да с timeout при блокировке может быть ошибочно опознан открытый сокет, если timeout ниже того времени, что необходимо для создания подключения. Но в моем случае 5сек должно хватить, т.к. все оборудование находится в локалке и ответ свыше 5 сек просто не должен быть. |
23.07.2012, 10:35 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Я только сказал, что
а) Не нужно блокировать сокет, а можно (и даже нужно) использовать select. б) Лучше не рассчитывать на встроейнный таймаут, но это как говорится, кому как. А будет ли таймаут 5сек, 15сек или 50сек это дело хозяйское. |
23.07.2012, 19:44 | #6 |
Форумчанин
Регистрация: 11.01.2012
Сообщений: 177
|
вы читать-то умеете? какой ещё обработчик? не нужно никаких обработчиков. вызываем функцию WSAConnect в неблокирующем режиме, ждём 5 сек, если коннекта не произошло, то отменяем операцию.
progromore.i2p - первый русскоязычный портал программистов в скрытосети
|
24.07.2012, 08:51 | #7 |
DI HALT RET
Форумчанин
Регистрация: 30.12.2010
Сообщений: 117
|
Попробую все варианты. Выберу наиболее быстрый и отказоустойчевый. Спасибо за подсказки.
|
25.07.2012, 22:45 | #8 |
DI HALT RET
Форумчанин
Регистрация: 30.12.2010
Сообщений: 117
|
По "а" немного не понял. Если я не заблокирую сокет, то connect длится установленное по умолчанию время и уже потом доходит до select. Если же select выставлять раньше, то конечно же все подключения с ошибками, ведь ему не от чего ждать ответа. По UDP протоколу может и получилось бы.
Последний раз редактировалось Tahoma; 25.07.2012 в 22:51. |
26.07.2012, 09:17 | #9 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Мы не сходились на термине "блокировать" с точностью до наоборот
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Ошибка Connect timeout | ramzes777 | Работа с сетью в Delphi | 3 | 10.10.2014 10:26 |
Timeout палит скрипт | stdio | Свободное общение | 0 | 16.02.2012 22:33 |
Если Connect timeout, то... | ramzes777 | Работа с сетью в Delphi | 3 | 11.11.2011 16:36 |
Контроль Timeout в idhttp | seet09 | Работа с сетью в Delphi | 3 | 26.06.2010 23:54 |
ClientSocket и TimeOut | Powerfull100 | Работа с сетью в Delphi | 0 | 22.10.2009 12:29 |