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

Вниз

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

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

Наверх




Память: 0.49 MB
Время: 0.037 c
9-1094678752
массив
2004-09-09 01:25
2005.01.09
Glscene Как создавать TGLFreeForm в рантайме ?


4-1101145077
yaric
2004-11-22 20:37
2005.01.09
имспользование PCL и PS драйверов для печати


1-1103710048
Руслана
2004-12-22 13:07
2005.01.09
Подскажите как грамотно решить следующую задачу


11-1085045840
dimon1979
2004-05-20 13:37
2005.01.09
Добавление нового KOL-компонента


14-1103642476
Болтуны, кто они?
2004-12-21 18:21
2005.01.09
Предлагаю выбрать наиболее болтливых, по принципу:





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