![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Все так плохо? :)