![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Контроль подключения к Интернет [D5, Win95/98]
igorx © (2002-11-05 10:54:00)Моя программа связывается с сервером через Интернет. На случай отсутствия связи в ней предусмотрен таймаут. Но вот проблема: при первом подключении, когда автоматически начинает отрабатывать набор номера телефона провайдера, проверка пароля и т.п. таймаут, понятно, успевает произойти.
Подскажите, как обойти указанную проблему не убирая контроля корректности подключения при первом входе в Интернет?
igorx (2002-11-05 13:02:00) [1]Я уже понял, что Indy намного лучше :))) Ладно, действительно, может в следующей версии программы я на них и перейду. Ну а со стандартными сокетами Borland никак нельзя определить, находятся ли они в состоянии соединения с сетью или срабатывание тайм-аута есть результат ошибки?
Reindeer Moss Eater (2002-11-05 12:56:00) [2]Клиент Indy начав коннект без установленной связи сгенерит исключение. А если связь есть и если соединение не будет установлено в заданное время возникнет другое исключение.
Ну как бы там ни было, кнопку улучшения качества связи ты не изобретешь.
igorx (2002-11-05 12:53:00) [3]Правильно, но на другой стороне должен стоять блокировочный сокет, что нежелательно (см.выше). И потом, чем тайм-аут Indy отличается от моего? Indy также дадут ошибку в моей ситуации, что не нужно :)
Reindeer Moss Eater (2002-11-05 12:49:00) [4]В Indy реализована поддержка таймаута при чтении/записи/соединении.
Что находится "на другой стороне" клиентской программе все равно.
igorx (2002-11-05 12:42:00) [5]У меня и сервер и клиент работают асинхронно. Я так понимаю, Indy ведь должны быть и на той, и на другой стороне? И тут еще вопрос: как бы Indy не были хороши, разве периодического "умирания" связи в общем случае можно избежать? Плохая связь, провайдеры и проч. Все равно, я бы не решился бросать программу в сеть без таймаута, на одних try"ях и OnError"ах. Ламеры есть ламеры, связь есть связь. Так что проблема все равно останется.
Reindeer Moss Eater (2002-11-05 12:34:00) [6]Так это ты описал серверный компонет. В TidTCPServer потоки работающие с клиентами реализованы внутри класса.
igorx (2002-11-05 12:27:00) [7]У меня программа асинхронная, т.е. по сокету приходят команды и данные инициирующие определенную реакцию независимо друг от друга. Я не могу, например, ждать после SendBuf реакцию другой стороны, я сразу должен быть готов к приему следующей команды.
По поводу адреса, который ты любезно скинул - там все по-французски, что ли? А хотя бы по-английски ничего нет?
Reindeer Moss Eater (2002-11-05 12:22:00) [8]Блокировочный режим вовсе не требует работы с потоками
igorx (2002-11-05 12:14:00) [9]Блокировочный режим - значит работа с потоками. Это достаточно большое усложнение логики работы программы, которая и так достаточно непроста. Кроме того, я эту программу получил "по наследству" и такой кардинальный переход заставит меня, скорее всего, переписать ее заново, что сложно и ненужно. Кроме указанной проблемы с ней, вроде бы, все в порядке. Мне бы узнать, как определить режим подключения :)))
igorx (2002-11-05 12:09:00) [10]А если он повиснет чисто на Open? И потом, такая ситуация может быть не только на Open. Например, моя программа периодически (несинхронно) должна получать от сервера некие порции данных. Если их долго нет, она шлет серверу маяк и ждет ответа. Если ламер-пользователь за это время каким-то образом успел выгрузить поддержку телефонного соединения, процесс подключения начнется сначала с печальным сообщением об ошибке тайм-аута (нет ответа на маяк в приемлимое время) которой на самом деле нет.
Reindeer Moss Eater (2002-11-05 12:05:00) [11]Два года говоришь?
http://www.rtfm.be/fpiette/icsuk.htm
А вообще я не находил веских причин не использовать blocking режим ни в GUI приложениях, ни в сервисах.
Digitman (2002-11-05 12:03:00) [12]Ставь Timer.Enabled =True в событие OnConnecting()
igorx (2002-11-05 12:02:00) [13]А че такое ICS?
Reindeer Moss Eater (2002-11-05 12:00:00) [14]ICS
igorx (2002-11-05 11:58:00) [15]В Indy сокеты только блокировочные, а мне нужне неблокировочные :)
Reindeer Moss Eater (2002-11-05 11:57:00) [16]Забыть про свой печальный двухгодичный опыт и перейти к использованию других библиотек. Например Indy 9.x
igorx (2002-11-05 11:54:00) [17]Ну, если на то пошло, то не только OnError, а прежде всего try except, т.к. сокетный Open чаще вываливается с исключением (как-то прочитал в FAQ). Впрочем, у меня есть и то, и другое. Но мой двухгодичный опыт работы с сокетами показывает, что на практике бывают ситуации, когда они просто "умирают". Тут без тайм-аута не обойтись. Вопрос в том, как определить, что сокет не ждет ответа, а подключается.
Reindeer Moss Eater (2002-11-05 11:50:00) [18]Если твоя программа не заморачивается с установлением соединения (считает, что оно есть), то обрабатывай событие OnError.
igorx (2002-11-05 11:45:00) [19]Клиент у себя на компьютере
Reindeer Moss Eater (2002-11-05 11:43:00) [20]Кто инициирует дозвон к провайдеру, если доступ по DialUP?