Текущий архив: 2007.02.11;
Скачать: CL | DM;
Внизоткуда взять описание типа TidIcmpClient? Найти похожие ветки
← →
cvg (2007-01-23 11:13) [0]Взял описание примера на Indy с http://www.citforum.ru/nets/articles/ping/. Написал так:
procedure TForm1.IdIcmpClient1Reply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
begin
ListBox1.Items.Add ("Reply:"+IntToStr (AReplyStatus.MsRoundTripTime));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Self.IdIcmpClient1.Host:="localhost";
Self.IdIcmpClient1.Ping;
TidIcmpClient.OnReply (Sender:TComponent; const AReplyStatus:TReplyStatus);
end;
В последней строчке (перед end"ом) она, естественно, говорит "Method identifier expected". Где его взять?
← →
Сергей М. © (2007-01-23 11:18) [1]Ге надо кго ни откуда брать.
Убери совсем эту строчку.
← →
Elen © (2007-01-23 11:19) [2]
> cvg
Это
TidIcmpClient.OnReply (Sender:TComponent; const AReplyStatus:
TReplyStatus);
говорит о том что нужно описать этот обработчик, а не вызывать его :
И не забудем выставить соответствующий интервал ожидания ответа, по завершении которого (или при получении данных от пингуемого) вызывается обработчик:
← →
cvg (2007-01-23 11:25) [3]Ну а как описать? Кстати, когда я убрал эту строчку, а вставил sleep(1000), программа заработала, но как-то странно: при первом нажатии кнопки выдает 15 или 16, а при последующих всегда ноль... Что бы это значило?
← →
Сергей М. © (2007-01-23 11:30) [4]
> Ну а как описать?
Не надо ничего описывать - у тебя все уже описано.
> вставил sleep(1000)
Зачем вставил-то ?
Какими соображениями ты руководствовался при "вставлянии" ?
← →
Elen © (2007-01-23 11:30) [5]
> Ну а как описать?
Ты уже это описал в началеprocedure TForm1.IdIcmpClient1Reply(AS...
← →
TCrash (2007-01-23 11:32) [6]cvg (23.01.07 11:25) [3]
Это значит, что бы свою прогу гоняешь в сети со скоростью минимум 10 Мб/с
← →
cvg (2007-01-23 11:36) [7]Если не надо вставлять, то чего ж она ругается, что этот тип не определен? А при вставлении sleep"а руководствовался тем соображением, что там в описании ппримера сказано:
И не забудем выставить соответствующий интервал ожидания ответа, по завершении которого (или при получении данных от пингуемого) вызывается обработчик:
TidIcmpClient.OnReply (Sender:TComponent; const AReplyStatus:TReplyStatus);
Хотя, ели я эту строчку убрал... А где же тогда реакция на событие OnReply?
← →
TCrash (2007-01-23 11:37) [8]При первом пинге происходит запрос по сетке различной информации, такой, например, как МАС адрес пингуемого устройства. Возможно что-то еще (просто не уверен).
Вот это и занимает некоторое время. После первого пинга эта инфа уже есть в кэши и запросов на нее не производится. потому такая петрушка со временем
← →
Elen © (2007-01-23 11:39) [9]
> А где же тогда реакция на событие OnReply?
А статейку почитать?
← →
cvg (2007-01-23 11:40) [10]2 TCrash:
Вообше-то, в будущем это дело должно войти в большую прогу, где пинговаться будет адрес в Инете...
← →
cvg (2007-01-23 11:42) [11]2 Crash:
то есть, 16 и ноль -- это время ожидания, что ли?
← →
cvg (2007-01-23 11:43) [12]2 Elen:
Почитать-то почитал, еще бы и понять...
← →
TCrash (2007-01-23 11:44) [13]Да.
И если это время окжется больше таймаута, то пинг не пройдет.
← →
Elen © (2007-01-23 11:48) [14]
> Почитать-то почитал, еще бы и понять...
Хм.
> И не забудем выставить соответствующий интервал ожидания
> ответа
Это значит выставить в IdIcmpClient1.ReceiveTimeout таймаут. Что еще сказать? Лучше скажи что ты не понял...
← →
cvg (2007-01-23 11:57) [15]Да, посмотреть на ReceiveTimeout я как-то не догадался... ну ладно, сделал я sleep(4000), но почему-то все равно первый раз выдвет 16, все последующме -- ноль. Непонятно...
← →
Elen © (2007-01-23 12:01) [16]
> но почему-то все равно первый раз выдвет 16, все последующме
> -- ноль.
см. [8]
← →
cvg (2007-01-23 12:05) [17]2 Elen:
Ну ладно, пусть так, но мне-то надо получить инфу, пропингивается этот адрес или нет. Как ее получить имеющимися у меня средствами?
← →
Elen © (2007-01-23 12:21) [18]
> но мне-то надо получить инфу, пропингивается этот адрес
> или нет. Как ее получить имеющимися у меня средствами?
Я могу поступить например так (Хотя у меня есть много способов пинга)unit Unit1;
interface
uses crtfox,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdRawBase, IdRawClient,
IdIcmpClient;
type
TForm1 = class(TForm)
IdIcmpClient1: TIdIcmpClient;
Button1: TButton;
Edit1: TEdit;
procedure IdIcmpClient1Reply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.IdIcmpClient1Reply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
begin
caption:=inttostr(AReplyStatus.BytesReceived);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
IdIcmpClient1.Host:=Edit1.Text;
IdIcmpClient1.Ping;
end;
end.
Кол-во обменянных байт в капшине.
← →
Elen © (2007-01-23 12:22) [19]О пардон : еще
IdIcmpClient1.ReceiveTimeout:=5000;
Чтоб небыло лишних вопросов ;)
← →
TCrash (2007-01-23 12:54) [20]cvg (23.01.07 11:57) [15]
Ваш Sleep тут рояли не играет. ОС регистрирует время отправки ICMP пакета(t1), затем регистрирует время получения отклика на него(t2). время отклика равно
result:=MillisecondsBetween(t1,t2);
С некоторыми издержками на преобразование типов и пр. Но это делает ОС, а не твоя программа, которую ты Sleep ^))
← →
cvg (2007-01-23 12:57) [21]3 Elen:
Да, спасибо, это я тормоз -- не посмотрел, что там в самом деле time возвращался в примере... А пинговать в фоновом режиме во время выполнения других действий -- это ведь не обязательно в одельном потоке?
← →
Elen © (2007-01-23 13:05) [22]
> А пинговать в фоновом режиме во время выполнения других
> действий -- это ведь не обязательно в одельном потоке?
А почему нет? Чем потоки плохи?
← →
cvg (2007-01-23 13:09) [23]Да принципиально ничем -- просто разбираться придется...
Страницы: 1 вся ветка
Текущий архив: 2007.02.11;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.045 c