![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
откуда взять описание типа TidIcmpClient? [D7, XP]
cvg © (2007-01-23 11:13:00)Взял описание примера на 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". Где его взять?
cvg (2007-01-23 13:09:00) [1]Да принципиально ничем -- просто разбираться придется...
Elen (2007-01-23 13:05:00) [2]
> А пинговать в фоновом режиме во время выполнения других
> действий -- это ведь не обязательно в одельном потоке?
А почему нет? Чем потоки плохи?
cvg (2007-01-23 12:57:00) [3]3 Elen:
Да, спасибо, это я тормоз -- не посмотрел, что там в самом деле time возвращался в примере... А пинговать в фоновом режиме во время выполнения других действий -- это ведь не обязательно в одельном потоке?
TCrash (2007-01-23 12:54:00) [4]cvg (23.01.07 11:57) [15]
Ваш Sleep тут рояли не играет. ОС регистрирует время отправки ICMP пакета(t1), затем регистрирует время получения отклика на него(t2). время отклика равно
result:=MillisecondsBetween(t1,t2);
С некоторыми издержками на преобразование типов и пр. Но это делает ОС, а не твоя программа, которую ты Sleep ^))
Elen (2007-01-23 12:22:00) [5]О пардон : еще
IdIcmpClient1.ReceiveTimeout:=5000;
Чтоб небыло лишних вопросов ;)
Elen (2007-01-23 12:21:00) [6]
> но мне-то надо получить инфу, пропингивается этот адрес
> или нет. Как ее получить имеющимися у меня средствами?
Я могу поступить например так (Хотя у меня есть много способов пинга)
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.
Кол-во обменянных байт в капшине.
cvg (2007-01-23 12:05:00) [7]2 Elen:
Ну ладно, пусть так, но мне-то надо получить инфу, пропингивается этот адрес или нет. Как ее получить имеющимися у меня средствами?
Elen (2007-01-23 12:01:00) [8]
> но почему-то все равно первый раз выдвет 16, все последующме
> -- ноль.
см. [8]
cvg (2007-01-23 11:57:00) [9]Да, посмотреть на ReceiveTimeout я как-то не догадался... ну ладно, сделал я sleep(4000), но почему-то все равно первый раз выдвет 16, все последующме -- ноль. Непонятно...
Elen (2007-01-23 11:48:00) [10]
> Почитать-то почитал, еще бы и понять...
Хм.
> И не забудем выставить соответствующий интервал ожидания
> ответа
Это значит выставить в IdIcmpClient1.ReceiveTimeout таймаут. Что еще сказать? Лучше скажи что ты не понял...
TCrash (2007-01-23 11:44:00) [11]Да.
И если это время окжется больше таймаута, то пинг не пройдет.
cvg (2007-01-23 11:43:00) [12]2 Elen:
Почитать-то почитал, еще бы и понять...
cvg (2007-01-23 11:42:00) [13]2 Crash:
то есть, 16 и ноль -- это время ожидания, что ли?
cvg (2007-01-23 11:40:00) [14]2 TCrash:
Вообше-то, в будущем это дело должно войти в большую прогу, где пинговаться будет адрес в Инете...
Elen (2007-01-23 11:39:00) [15]
> А где же тогда реакция на событие OnReply?
А статейку почитать?
TCrash (2007-01-23 11:37:00) [16]При первом пинге происходит запрос по сетке различной информации, такой, например, как МАС адрес пингуемого устройства. Возможно что-то еще (просто не уверен).
Вот это и занимает некоторое время. После первого пинга эта инфа уже есть в кэши и запросов на нее не производится. потому такая петрушка со временем
cvg (2007-01-23 11:36:00) [17]Если не надо вставлять, то чего ж она ругается, что этот тип не определен? А при вставлении sleep'а руководствовался тем соображением, что там в описании ппримера сказано:
И не забудем выставить соответствующий интервал ожидания ответа, по завершении которого (или при получении данных от пингуемого) вызывается обработчик:
TidIcmpClient.OnReply (Sender:TComponent; const AReplyStatus:TReplyStatus);
Хотя, ели я эту строчку убрал... А где же тогда реакция на событие OnReply?
TCrash (2007-01-23 11:32:00) [18]cvg (23.01.07 11:25) [3]
Это значит, что бы свою прогу гоняешь в сети со скоростью минимум 10 Мб/с
Elen (2007-01-23 11:30:00) [19]
> Ну а как описать?
Ты уже это описал в началеprocedure TForm1.IdIcmpClient1Reply(AS...
Сергей М. (2007-01-23 11:30:00) [20]
> Ну а как описать?
Не надо ничего описывать - у тебя все уже описано.
> вставил sleep(1000)
Зачем вставил-то ?
Какими соображениями ты руководствовался при "вставлянии" ?