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

Вниз

Как пропинговать ряд компьютеров   Найти похожие ветки 

 
Phantom   (2004-05-28 13:03) [0]

дравствуйте уважаемые мастера, не подскажете в чём проблема, ситуация следущая данный код по идее должен пинговать все IP адреса которые записаны в ListBox1 и записывать ответ на попытку пинга в ListBox2, но проблема в том что пингуется только один (первый) адрес, а не все. Если не сложно помогите разобраться. Вот код:

unit Unit1;  

interface  

uses  
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
winsock, StdCtrls;  

type  
IPINFO = record  
Ttl :char;  
Tos :char;  
IPFlags :char;  
OptSize :char;  
Options :^char;  
end;  

type  
ICMPECHO = record  
Source :longint;  
Status :longint;  
RTTime :longint;  
DataSize:Shortint;  
Reserved:Shortint;  
pData :^variant;  
i_ipinfo:IPINFO;  
end;  

TIcmpCreateFile = function():integer; {$IFDEF WIN32} stdcall; {$ENDIF}  
TIcmpCloseHandle = procedure(var handle:integer);{$IFDEF WIN32} stdcall; {$ENDIF}  
TIcmpSendEcho = function(var handle:integer; endereco:DWORD; buffer:variant; tam:WORD; IP:IPINFO; ICMP:ICMPECHO; tamicmp:DWORD; tempo:DWORD):DWORD;{$IFDEF WIN32} stdcall; {$ENDIF}  

type  
TForm1 = class(TForm)  
Button1: TButton;  
ListBox1: TListBox;  
ListBox2: TListBox;
procedure Button1Click(Sender: TObject);  
private  
{ Private declarations }  
public  

end;  

var  
Form1: TForm1;  

implementation  

{$R *.DFM}  

procedure TForm1.Button1Click(Sender: TObject);  
var
wsadt : wsadata;
icmp :icmpecho;
HNDicmp,hndFile,Retorno,x,i : integer;
Host :PHostEnt;
Destino :in_addr;
Endereco :^DWORD;
IP : ipinfo;
dwRetorno :DWORD;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle : TIcmpCloseHandle;
IcmpSendEcho : TIcmpSendEcho;  
begin
for i:=0 to ListBox1.Items.Count do begin
HNDicmp := LoadLibrary("ICMP.DLL");
if (HNDicmp <> 0) then begin  
@IcmpCreateFile := GetProcAddress(HNDicmp,"IcmpCreateFile");  
@IcmpCloseHandle := GetProcAddress(HNDicmp,"IcmpCloseHandle");
@IcmpSendEcho := GetProcAddress(HNDicmp,"IcmpSendEcho");  
if (@IcmpCreateFile=nil) or (@IcmpCloseHandle=nil) or (@IcmpSendEcho=nil) then begin
Application.MessageBox("Erro pegando endereзos ICMP","Error", MB_OK);  
FreeLibrary(HNDicmp);  
end;
end;  
Retorno := WSAStartup($0101,wsadt);
if (Retorno <> 0) then begin  
WSACleanup();
FreeLibrary(HNDicmp);  
end;
Destino.S_addr := inet_addr(Pchar(ListBox1.Items[i]));
if (Destino.S_addr = 0) then begin  
Host := GetHostbyName(PChar(ListBox1.Items[i]));
end  
else begin
Host := GetHostbyAddr(@Destino,sizeof(in_addr), AF_INET);  
end;  
if (host = nil) then begin
ListBox2.Items.Add("Не пингуется");
WSACleanup();
FreeLibrary(HNDicmp);  
exit;  
end;
ListBox2.Items.Add("Пингуется");
Endereco := @Host.h_addr_list;
HNDFile := IcmpCreateFile();
for x:= 0 to 4 do begin  
Ip.Ttl := char(255);
Ip.Tos := char(0);  
Ip.IPFlags := char(0);
Ip.OptSize := char(0);  
Ip.Options := nil;  
dwRetorno := IcmpSendEcho(HNDFile,Endereco^,null,0,Ip,Icmp,sizeof(Icmp),DWORD(5000));
Destino.S_addr := icmp.source;
end;
IcmpCLoseHandle(HNDFile);
FreeLibrary(HNDicmp);
WSACleanup();
end;
end.


 
Digitman ©   (2004-05-28 13:55) [1]

у тебя в самый первый for-цикл по элементам ListBox1 не входит собственно пинг i-го элемента

собственно ключевой момент пинга - это вызов IcmpSendEcho(), он у тебя делается 4 раза в цикле, не имеющем отношения к перебору элементов ListBox1, все четыре раза переменная i равна одному и тому же значению

непонятно так же, зачем в самом первом цикле много раз загружается и выгружается библиотека

if (host = nil) then begin
ListBox2.Items.Add("Не пингуется");
WSACleanup();
FreeLibrary(HNDicmp);  
exit;  
end;
ListBox2.Items.Add("Пингуется");

это не имеет отношения к пингу как таковому, это - работа с ДНС , так что диагностические сообщения здесь не верны

тебе вообще не стыдно так безобразно оформленный код приводить здесь ?


 
Phantom   (2004-05-28 15:51) [2]

Спасибо, за подробный ответ,этот код я взял с одного из FAQ"ov по делфи, в котором собственно и рассказывается как реализовать этот самый пинг, код был дан без комментариев, и ввиду того что я мало программирую, несмог в нем до конца разобраться. Конечно я его изменил для своей задачи как мне было необходимо,но сам алгоритм пинга я взял от туда, и вот с этим циклом я до конца немог разобраться, спасибо что все пояснил, оказывается не всем статьям по программированию можно доверять.


 
Digitman ©   (2004-05-28 16:26) [3]


> Phantom   (28.05.04 15:51) [2]



> оказывается не всем статьям по программированию можно доверять.


истину глаголешь



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

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

Наверх




Память: 0.48 MB
Время: 0.029 c
4-1087126783
SergeyM
2004-06-13 15:39
2004.07.25
Раскладка клавиатуры


3-1088553025
Alexey Leonchik
2004-06-30 03:50
2004.07.25
Перекодировка MS1251 -> KOI8-R


3-1088686069
Plt
2004-07-01 16:47
2004.07.25
Выполнение запроса с помощью TOracleQuery (DOA) в потоке.


8-1084266319
Ozone
2004-05-11 13:05
2004.07.25
JPEG + разбиение рисунка


1-1089379025
DelphiNew
2004-07-09 17:17
2004.07.25
Не раскрывается TreeView