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

Вниз

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

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

Наверх




Память: 0.46 MB
Время: 0.04 c
3-1088771516
artem123
2004-07-02 16:31
2004.07.25
Изменение типа поля в таблице (Paradox)


14-1089021380
VEG
2004-07-05 13:56
2004.07.25
Подхватил какой-то троянец


14-1089167909
negrila
2004-07-07 06:38
2004.07.25
кассовые аппараты


3-1087997050
overstep
2004-06-23 17:24
2004.07.25
Получение выходного параметра


1-1089798511
Litr
2004-07-14 13:48
2004.07.25
QReport





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский