Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.30;
Скачать: CL | DM;

Вниз

Контроль подключения к Интернет   Найти похожие ветки 

 
igorx ©   (2002-11-05 10:54) [0]

Моя программа связывается с сервером через Интернет. На случай отсутствия связи в ней предусмотрен таймаут. Но вот проблема: при первом подключении, когда автоматически начинает отрабатывать набор номера телефона провайдера, проверка пароля и т.п. таймаут, понятно, успевает произойти.
Подскажите, как обойти указанную проблему не убирая контроля корректности подключения при первом входе в Интернет?


 
Digitman ©   (2002-11-05 11:01) [1]

Код приведи свой


 
igorx ©   (2002-11-05 11:07) [2]

Код-то довольно большой... :)
Ну, для примера:

Timer.Enabled:=True;
Socket.Open;
Timer.Enabled:=False;

...

procedure TimerOnTimer(Sender: TObject);
begin
//Обработка тайм-аута
end;

Так вот, необходимо, чтобы только!!! в вышеописанном случае таймаут не отрабатывался


 
Reindeer Moss Eater   (2002-11-05 11:16) [3]

Так кто заставляет обрабатывать-то? Не обрабатывай


 
igorx ©   (2002-11-05 11:21) [4]

Правильно, но как мне определить, что произошло именно то событие (см. выше), которое не надо обрабатывать? Остальные то надо.


 
Reindeer Moss Eater   (2002-11-05 11:28) [5]

Не запускай свой таймер пока не выполнится дозвон.


 
igorx ©   (2002-11-05 11:31) [6]

А как мне определить, что дозвон окончился или вообще происходит? Программа для ламеров, там возможны любые варианты (от уже установленной связи с Интернет до полного отсутствия подключения в принципе)


 
Reindeer Moss Eater   (2002-11-05 11:31) [7]

А как мне определить чем ты звонишь?


 
igorx ©   (2002-11-05 11:34) [8]

Так я и не знаю, чем звоню :)
Программа для широкого распространения в Интернет, звонит могут чем угодно (или ничем вообще)


 
Reindeer Moss Eater   (2002-11-05 11:36) [9]

Ты хочешь сказать что это не твоя программа?


 
igorx ©   (2002-11-05 11:39) [10]

Программа моя, пользователи программы (и их компьютеры) не мои :)))


 
Reindeer Moss Eater   (2002-11-05 11:43) [11]

Кто инициирует дозвон к провайдеру, если доступ по DialUP?


 
igorx ©   (2002-11-05 11:45) [12]

Клиент у себя на компьютере


 
Reindeer Moss Eater   (2002-11-05 11:50) [13]

Если твоя программа не заморачивается с установлением соединения (считает, что оно есть), то обрабатывай событие OnError.


 
igorx ©   (2002-11-05 11:54) [14]

Ну, если на то пошло, то не только OnError, а прежде всего try except, т.к. сокетный Open чаще вываливается с исключением (как-то прочитал в FAQ). Впрочем, у меня есть и то, и другое. Но мой двухгодичный опыт работы с сокетами показывает, что на практике бывают ситуации, когда они просто "умирают". Тут без тайм-аута не обойтись. Вопрос в том, как определить, что сокет не ждет ответа, а подключается.


 
Reindeer Moss Eater   (2002-11-05 11:57) [15]

Забыть про свой печальный двухгодичный опыт и перейти к использованию других библиотек. Например Indy 9.x


 
igorx ©   (2002-11-05 11:58) [16]

В Indy сокеты только блокировочные, а мне нужне неблокировочные :)


 
Reindeer Moss Eater   (2002-11-05 12:00) [17]

ICS


 
igorx ©   (2002-11-05 12:02) [18]

А че такое ICS?


 
Digitman ©   (2002-11-05 12:03) [19]

Ставь Timer.Enabled =True в событие OnConnecting()


 
Reindeer Moss Eater   (2002-11-05 12:05) [20]

Два года говоришь?
http://www.rtfm.be/fpiette/icsuk.htm
А вообще я не находил веских причин не использовать blocking режим ни в GUI приложениях, ни в сервисах.


 
igorx ©   (2002-11-05 12:09) [21]

А если он повиснет чисто на Open? И потом, такая ситуация может быть не только на Open. Например, моя программа периодически (несинхронно) должна получать от сервера некие порции данных. Если их долго нет, она шлет серверу маяк и ждет ответа. Если ламер-пользователь за это время каким-то образом успел выгрузить поддержку телефонного соединения, процесс подключения начнется сначала с печальным сообщением об ошибке тайм-аута (нет ответа на маяк в приемлимое время) которой на самом деле нет.


 
igorx ©   (2002-11-05 12:14) [22]

Блокировочный режим - значит работа с потоками. Это достаточно большое усложнение логики работы программы, которая и так достаточно непроста. Кроме того, я эту программу получил "по наследству" и такой кардинальный переход заставит меня, скорее всего, переписать ее заново, что сложно и ненужно. Кроме указанной проблемы с ней, вроде бы, все в порядке. Мне бы узнать, как определить режим подключения :)))


 
Reindeer Moss Eater   (2002-11-05 12:22) [23]

Блокировочный режим вовсе не требует работы с потоками


 
igorx ©   (2002-11-05 12:27) [24]

У меня программа асинхронная, т.е. по сокету приходят команды и данные инициирующие определенную реакцию независимо друг от друга. Я не могу, например, ждать после SendBuf реакцию другой стороны, я сразу должен быть готов к приему следующей команды.
По поводу адреса, который ты любезно скинул - там все по-французски, что ли? А хотя бы по-английски ничего нет?


 
Reindeer Moss Eater   (2002-11-05 12:34) [25]

Так это ты описал серверный компонет. В TidTCPServer потоки работающие с клиентами реализованы внутри класса.


 
igorx ©   (2002-11-05 12:42) [26]

У меня и сервер и клиент работают асинхронно. Я так понимаю, Indy ведь должны быть и на той, и на другой стороне? И тут еще вопрос: как бы Indy не были хороши, разве периодического "умирания" связи в общем случае можно избежать? Плохая связь, провайдеры и проч. Все равно, я бы не решился бросать программу в сеть без таймаута, на одних try"ях и OnError"ах. Ламеры есть ламеры, связь есть связь. Так что проблема все равно останется.


 
Reindeer Moss Eater   (2002-11-05 12:49) [27]

В Indy реализована поддержка таймаута при чтении/записи/соединении.
Что находится "на другой стороне" клиентской программе все равно.


 
igorx ©   (2002-11-05 12:53) [28]

Правильно, но на другой стороне должен стоять блокировочный сокет, что нежелательно (см.выше). И потом, чем тайм-аут Indy отличается от моего? Indy также дадут ошибку в моей ситуации, что не нужно :)


 
Reindeer Moss Eater   (2002-11-05 12:56) [29]

Клиент Indy начав коннект без установленной связи сгенерит исключение. А если связь есть и если соединение не будет установлено в заданное время возникнет другое исключение.

Ну как бы там ни было, кнопку улучшения качества связи ты не изобретешь.


 
igorx ©   (2002-11-05 13:02) [30]

Я уже понял, что Indy намного лучше :))) Ладно, действительно, может в следующей версии программы я на них и перейду. Ну а со стандартными сокетами Borland никак нельзя определить, находятся ли они в состоянии соединения с сетью или срабатывание тайм-аута есть результат ошибки?



Страницы: 1 вся ветка

Текущий архив: 2002.12.30;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
14-99303
Pegas
2002-10-26 10:31
2002.12.30
Программирование за деньги!


3-99032
Максим
2002-12-10 10:58
2002.12.30
fox базы - Language driver not found


1-99159
___Nikolay
2002-12-17 12:21
2002.12.30
Как сделать так, чтобы можно было отменить


8-99212
AlexT1000
2002-09-12 16:47
2002.12.30
Список песен Audio CD?


6-99221
JC
2002-10-15 23:56
2002.12.30
Где можно найти пример