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

Вниз

простейший пинг - как?   Найти похожие ветки 

 
Grundic ©   (2004-10-22 08:57) [0]

Посоветуйте, пожалуйста, может у кого уже есть заготовки - простой способ пропинговать машину в сети.


 
Rouse_ ©   (2004-10-22 09:22) [1]

http://www.delphimaster.ru/articles/icmp.html


 
Дмитрий Ботвин   (2004-10-22 11:03) [2]

Самый простой способ - это запустить Ping xxx.xxx.xxx.xxx c
помощью функции WinExec. Писать практически не придётся....


 
Grundic ©   (2004-10-22 11:39) [3]

Запуск родного пинга имеет как плюсы, так и минусы. И, как обычно :), нужны именно эти плюсы без минусов. 6)
%systemroot%\system32\ping.exe:
Плюсы - не вызывает ошибок, если кабель валяется где-то рядом (нет связи).
Минусы - вызывать его WinExec"ом, потом считывать выходные данные - занимает довольно большое кол-во машинного времени. Да и иногда зависает, если я пытаюсь максимально ускорить этот процесс. Кроме того - как-то неприятно зависеть от чего-то ещё, кроме Винды. :)


 
Дмитрий Ботвин   (2004-10-22 12:09) [4]

Тогда тока самому писать :-)))


 
Grundic ©   (2004-10-22 12:35) [5]

То-то и оно... :)))
Дмитрий, а у Вас (совершенно случайно %))))) нет исходников МелкоМягкого пинга.экзе?


 
Дмитрий Ботвин   (2004-10-22 13:05) [6]

Попробуй вот этот. МелкоМягким его не назовёшь, но другова под
рукой не нашлось. Дома есть ещё какой-то, завтра принесу...

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;
Button2: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public

end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
wsadt : wsadata;
icmp :icmpecho;
HNDicmp : integer;
hndFile :integer;
Host :PHostEnt;
Destino :in_addr;
Endereco :^DWORD;
IP : ipinfo;
Retorno :integer;
dwRetorno :DWORD;
x :integer;

IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle : TIcmpCloseHandle;
IcmpSendEcho : TIcmpSendEcho;

begin
if (edit1.Text = "") then begin
Application.MessageBox("Digite um HostName ou um End. IP",
"Error", MB_OK);
exit;
end;
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&ccedil;os ICMP","Error", MB_OK);
FreeLibrary(HNDicmp);
end;
end;
Retorno := WSAStartup($0101,wsadt);

if (Retorno <> 0) then begin
Application.MessageBox("N&atilde;o foi poss&iacute;vel carregar WinSockets","WSAStartup", MB_OK);
WSACleanup();
FreeLibrary(HNDicmp);
end;

Destino.S_addr := inet_addr(Pchar(Edit1.text));
if (Destino.S_addr = 0) then begin
Host := GetHostbyName(PChar(Edit1.text));
end
else begin
Host := GetHostbyAddr(@Destino,sizeof(in_addr), AF_INET);
end;

if (host = nil) then begin
Application.MessageBox("Host n&atilde;o encontrado","Error", MB_OK);
WSACleanup();
FreeLibrary(HNDicmp);
exit;
end;
memo1.Lines.Add("Pinging " + Edit1.text);

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;
Memo1.Lines.Add("Pingou " + Edit1.text);
end;

IcmpCLoseHandle(HNDFile);
FreeLibrary(HNDicmp);
WSACleanup();
end;

end.


 
Anatoly Podgoretsky ©   (2004-10-22 13:31) [7]

Grundic ©   (22.10.04 11:39) [3]
Минусы - вызывать его WinExec"ом, потом считывать выходные данные - занимает довольно большое кол-во машинного времени. Да и иногда зависает, если я пытаюсь максимально ускорить этот процесс. Кроме того - как-то неприятно зависеть от чего-то ещё, кроме Винды. :)

Не зависает, по причине, того что это внешняя программа, управление отдается сразу же. Но использовать функции из Win 3.1 как то не кошерно. В Win9x/NT есть ShellExecute/CreateProcess.

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

Зависимости кроме "Винды" нет, это чисто Windows


 
Grundic ©   (2004-10-22 15:05) [8]


> Дмитрий Ботвин   (22.10.04 13:05) [6]
> Попробуй вот этот. МелкоМягким его не назовёшь, но другова
> под
> рукой не нашлось. Дома есть ещё какой-то, завтра принесу...

Спасибо. Наковырял то, что мне было нужно... %)

http://delphimaster.net/view/6-1098380289/



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

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

Наверх




Память: 0.49 MB
Время: 0.038 c
3-1102488768
denis24
2004-12-08 09:52
2005.01.09
Работа с AdoQuery в отдельном потоке


1-1103537115
Andrey_
2004-12-20 13:05
2005.01.09
Управление модемом


1-1103618080
paule
2004-12-21 11:34
2005.01.09
Проблема с переменной


1-1103552777
Dmitry
2004-12-20 17:26
2005.01.09
TChart. Метки перекрывают друг друга. Как избежать?


14-1103021793
Alexander Panov
2004-12-14 13:56
2005.01.09
Выборы в Украине. Противостояние. (Продолжение 4)