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

Вниз

idUDPClient - проверка перед отправкой - как?   Найти похожие ветки 

 
Grundic ©   (2004-10-21 21:38) [0]

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


 
Grundic ©   (2004-10-22 11:33) [1]

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


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

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


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

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

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

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


 
Grundic ©   (2004-10-22 13:06) [4]

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


 
Reindeer Moss Eater ©   (2004-10-22 13:15) [5]

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


 
Reindeer Moss Eater ©   (2004-10-22 13:18) [6]

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

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


 
Grundic ©   (2004-10-22 13:44) [7]

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


 
Reindeer Moss Eater ©   (2004-10-22 14:22) [8]

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

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

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

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


 
Digitman ©   (2004-10-22 14:44) [9]


> Grundic


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

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


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


> 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;

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

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


 
Grundic ©   (2004-10-22 16:48) [11]

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

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

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


 
XProger ©   (2004-10-23 04:49) [12]

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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.024 c
1-1103704794
ORMADA
2004-12-22 11:39
2005.01.09
TThread


8-1096944491
Ozone
2004-10-05 06:48
2005.01.09
Video for Windows


1-1103790412
zrv
2004-12-23 11:26
2005.01.09
преобразование даты


6-1098093599
Zelius
2004-10-18 13:59
2005.01.09
Проблемы с TidHttpserver.MaxConnections в Indy 9


14-1103545527
Comp
2004-12-20 15:25
2005.01.09
MSDN - какая разница ?