Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.036 c
14-1103529471
TUser
2004-12-20 10:57
2005.01.09
Байкал-финанс


1-1103799346
akvilon
2004-12-23 13:55
2005.01.09
Уникальность узлов дерева, как этого добиться?


14-1103639656
Чеширский_Кот
2004-12-21 17:34
2005.01.09
MONEY: Алексу, Мазуту и всем-всем-всем


3-1102596171
Kolya
2004-12-09 15:42
2005.01.09
Ошибка SQL


1-1103487729
redlord
2004-12-19 23:22
2005.01.09
tstringgrid смена ячейки для ввода





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский