Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

idUDPClient - проверка перед отправкой - как? [Win2k]


Grundic ©   (2004-10-21 21:38:00) 

При отсутствии связи с внешним миром функция IdUDPClient.Send() вызывает ошибку.
Посоветуйте - как проверять наличие связи или просто эту ошибку задвинуть?
Важно быстродействие проверки - ф-ция вызывается довольно часто.


XProger   (2004-10-23 04:49:00) [1]

Кидаешь на форму TApplicationEvents и самомтоятельно обрабатываешь событие onException...

Если пишешь без VCL то:
uses
SysUtils;
...
try
<опасный код>
except
end;


Grundic   (2004-10-22 16:48:00) [2]

Флейм, оффтоп:

> Reindeer Moss Eater ©   (22.10.04 13:18) [6]
> Стоит ли браться за удаленное администрирование, если ничего
> не слышал про обработку исключительных ситуаций

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


Grundic   (2004-10-22 15:01:00) [3]


> Digitman

Согласен. Но мне, как уже было выше сказано, не важна (почти) доходимость пакета до сервака. Важно наличие "свободного выхода" пакета из локалки.


> Reindeer Moss Eater

Понял. :) Да, согласен. Но (у меня лично) разница во времени между проверкой и отправлением очень незначительна.

"В наш век нанотехнологий туалетная бумага имеет длянну 54 +- 0.5 м!"

Программулина не "отцовская", и даже не претендует. Просто проба пера...

Сделал следующее (спасибо Дмитрию Ботвинуза подсказку):

function RouteToHost(HostName:String):Boolean;
var
wsadt : wsadata;
Destino :in_addr;
Host :PHostEnt;
begin
WSAStartup($0101,wsadt);
Destino.S_addr := inet_addr(Pchar(HostName));
if (Destino.S_addr = 0) then
 begin
  Host := GetHostbyName(PChar(HostName));
 end
else
 begin
  Host := GetHostbyAddr(@Destino,sizeof(in_addr), AF_INET);
 end;
WSACleanup();
Result:=(host <> nil);
end;

Основана на тупой попытке получить "имя" хоста. Взял потому, что она не вызывает ошибок. НЕ СРАБОТАЛА пробиваясь к моему линуховому роутеру, СРАБОТАЛА пробиваясь к Виндовому серваку.

Ногами не бить! :) Она меня просто устроила, никому не навязываю.


Digitman   (2004-10-22 14:44:00) [4]


> Grundic


понимаешь ли, т.н. "наличие связи" определяется отнюдь не только "воткнутостью" коннектора сет.кабеля куда-то там

на маршруте следования пакетов, отправляемых твоим хостом, у одного из маршрутизаторов где-то в недрах Инета может случиться понос .. твой пакет может и не дойти до адресата, однако это не означает, что "связи нет" - у тебя есть нормальная связь с твоим провайдером, и он по-прежнему исправно пытается транслировать твои пакеты


Reindeer Moss Eater   (2004-10-22 14:22:00) [5]

если я ПРАВИЛЬНО понял

Неправильно.

Смысл вот в чем:
Работоспособность канала во время проверки - это одно.
А его работоспособность после проверки - это совсем другое.

Это все равно, что зная, что в магазине частенько не бывает пива ты приходишь в этом магазин проверить, а есть ли там пиво (но не берешь с собой кошелька).
И если пиво есть, возвращаешься домой за кошельком и идешь в магазин снова.


Grundic   (2004-10-22 13:44:00) [6]

В "сказке", если я ПРАВИЛЬНО понял ты продемонстрировал ситуацию с переодически исчезающим каналом. С этим действительно можно бороться посылая пакеты с рандомным временным интервалом - тогда один из них пролетит с некоторой высокой вероятностью.
Мне важно другое - не "пролет" пакета сквозь временную "решетку" связи, а отсутствие "брызг при ударе об эту самую решетку".
Во как. :)


Reindeer Moss Eater   (2004-10-22 13:18:00) [7]

Вот такая проблема. :/

Стоит ли браться за удаленное администрирование, если ничего не слышал про обработку исключительных ситуаций?
Может лучше "Hello World" ?


Reindeer Moss Eater   (2004-10-22 13:15:00) [8]

Ты так и не понял про что я тебе рассказывал сказку.


Grundic   (2004-10-22 13:06:00) [9]

Проблема не в периодическом выключении канала (хотя решение задачи при заданных условиях красиво :), а в том, что хитрый юзер может "случайно" выдернуть ненадолго кабель.
Я пишу программу (для домена), которая запускается в начале сеанса, выполняет Self.Hide и так и висит невидимой, показывая мне действия юзера. А вот кодгда юзер злобно выдергивает кабелек - прога вызывает ошибку, зависает, и "гордо паказывает юзеру, что она вообще существует, как её звать и что он больше не будет ему мешать..." :).
Вот такая проблема. :/


Reindeer Moss Eater   (2004-10-22 11:57:00) [10]

Представь, что ты с частотой X проверяешь наличие связи.
А в это время я с этой же частотой включаю/выключаю канал.
Но только в противофазе с тобой.

Ты проверяешь - я выключаю. Ты заканчиваешь проверять - я включаю.

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


Reindeer Moss Eater   (2004-10-22 11:49:00) [11]

Все даже намного хуже.


Grundic   (2004-10-22 11:33:00) [12]

Все так плохо? :)


Наверх

Титульная страница Поиск, карта сайта Написать письмо