Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2014, 20:19   #1
nerde
 
Аватар для nerde
 
Регистрация: 23.11.2011
Сообщений: 3
Вопрос Как реализовать одновременный пинг нескольких хостов?

Привет, форумчане
Пишу программу мониторинга локальной сети (курсовая работа). Есть несколько рабочих вопросов. В программировании знания очень слабые.

Припустим будет прописано где-то в программе через массив или возможно браться с файла набор IP адресов для проверки работает узел или нет. Как реализовать одновременный пинг нескольких хостов?

Delphi 7 + Indy

Сам код пингирования:
Код:
procedure TForm1.btnPingClick(Sender: TObject);
const n=1;
var i:Byte;
begin

        Self.IdIcmpClient1.Host:=edtHost.Text;
        // Memo1.Lines.Add(IntToStr(IdIcmpClient1.ReplyStatus.TimeToLive));

        Memo1.Lines.Add('Transfer with '+edtHost.Text+' ['+IdIcmpClient1.ReplyStatus.FromIpAddress+'] with '+IntToStr(IdIcmpClient1.ReplyStatus.BytesReceived)+' byte');
	      	begin
		      	Self.IdIcmpClient1.Host:=edtHost.Text;
			      Self.IdIcmpClient1.Ping;
			      if Self.IdIcmpClient1.ReplyStatus.ReplyStatusType <> rsEcho then
			      	begin
				      	Memo1.Lines.Add('Time Out');
			      	end;
			      if (Self.IdIcmpClient1.ReplyStatus.ReplyStatusType = rsEcho) and (IdIcmpClient1.ReceiveTimeout>0) then
			      	begin
			      		Memo1.Lines.Add('Reply from '+IdIcmpClient1.ReplyStatus.FromIpAddress+': number byte = '+IntToStr(IdIcmpClient1.ReplyStatus.BytesReceived)+' time = '+ IntToStr(IdIcmpClient1.ReplyStatus.MsRoundTripTime)+' TTL='+IntToStr(IdIcmpClient1.ReplyStatus.TimeToLive));
			      	end;
	      	end;
        if IdIcmpClient1.ReplyStatus.TimeToLive=64 then
          Memo1.Lines.Add('Operation System - Linux');
        if (IdIcmpClient1.ReplyStatus.TimeToLive=128) and (IdIcmpClient1.ReplyStatus.ReplyStatusType=rsEcho)and (IdIcmpClient1.ReceiveTimeout>0) then
          Memo1.Lines.Add('Operation System - Windows');
        if (IdIcmpClient1.ReplyStatus.TimeToLive<>64)and (IdIcmpClient1.ReplyStatus.ReplyStatusType<>rsEcho)then
          Memo1.Lines.Add('Operation System - no info');
        Memo1.Lines.Add('');
end;

Последний раз редактировалось nerde; 11.03.2014 в 20:22.
nerde вне форума Ответить с цитированием
Старый 11.03.2014, 20:53   #2
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

потоки, синхронизация.
Кольша вне форума Ответить с цитированием
Старый 12.03.2014, 12:53   #3
nerde
 
Аватар для nerde
 
Регистрация: 23.11.2011
Сообщений: 3
По умолчанию

Че та не могу разобраться вроде все верно делаю, но потоки не создаются ткните носом плз.

Код:
  public
    { Public declarations }
    function PingHost(aHost:string):Boolean;
  end;

type
  TPingThread = class (TThread)
  private
    { Private declarations }
  public
    { Public declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//****************************** main code ********************************

procedure TForm1.Button1Click(Sender: TObject);
var  PingThread: TPingThread;
begin
     PingThread:=TPingThread.Create(true);
     PingThread.FreeOnTerminate:=True;
     PingThread.Priority:=tpLower;
     PingThread.Resume;
end;




//******************************* my functions and procedures ****************************

function TForm1.PingHost(aHost: string): Boolean;  //function pinger
begin
      Result:=False;
      Form1.IdIcmpClient1.Host:=aHost;
     	begin
	      	Form1.IdIcmpClient1.Host:=aHost;
		      Form1.IdIcmpClient1.Ping;

  	      if Form1.IdIcmpClient1.ReplyStatus.ReplyStatusType <> rsEcho then
	      	begin
		      	Result:=False;
	      	end;

		      if (Form1.IdIcmpClient1.ReplyStatus.ReplyStatusType = rsEcho) and (Form1.IdIcmpClient1.ReceiveTimeout>0) then
	      	begin
	      		Result:=True;
	      	end;
     	end;
end;

{ TPingThread }

procedure TPingThread.Execute;
var i:Byte;
    aHost:string;
begin
   for i:=1 to 20 do  //array ip address for no sync and no thread
        begin
          aHost:=('192.168.130.'+IntToStr(i));
          Form1.PingHost(aHost);
          if Form1.PingHost(aHost)=True then
            begin
              Form1.Memo1.Lines.Add(aHost+' host up');
            end
          else Form1.Memo1.Lines.Add(aHost+' host down');
          sleep(80);
        end;
end;


Почти разобрался, нужно провести синхронизацию. Но чего с чем? :/

Последний раз редактировалось nerde; 12.03.2014 в 13:06.
nerde вне форума Ответить с цитированием
Старый 12.03.2014, 13:03   #4
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

ну IdIcmpClient нужно создавать в ручную, во вторых нужно динамично создавать, без переменных.
Кольша вне форума Ответить с цитированием
Старый 12.03.2014, 13:16   #5
nerde
 
Аватар для nerde
 
Регистрация: 23.11.2011
Сообщений: 3
Вопрос

Цитата:
Сообщение от Кольша Посмотреть сообщение
ну IdIcmpClient нужно создавать в ручную
Вручную?
Цитата:
во вторых нужно динамично создавать, без переменных.
То есть, лучше сделать документ с ір адресами и уже оттуда их тянуть?
nerde вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
одновременный поиск на нескольких таблицах Red Warrior Microsoft Office Excel 0 24.06.2013 22:51
Асинхронный пинг множества хостов kpoko C# (си шарп) 7 20.03.2013 17:01
Одновременный фильтр на нескольких листах PAMAC Microsoft Office Excel 2 26.09.2012 22:39
Одновременный поиск нескольких значений Hayaname БД в Delphi 19 20.08.2012 13:10
Одновременный запуск нескольких аудио файлов из ресурса Trial Мультимедиа в Delphi 4 05.02.2010 17:56