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

Вниз

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

 
Витёк ©   (2002-08-27 05:01) [0]

Если можно,что-нибудь попроще чем через WebBrowser


 
kosmach ©   (2002-08-27 06:51) [1]

А стандартный виндовый ping тебе не подходит?


 
Polevi ©   (2002-08-27 09:37) [2]

Netscape Navigator подойдет ?


 
Neyrospace   (2002-08-27 10:04) [3]

ICMPAPI.dll


 
Витёк ©   (2002-08-28 03:45) [4]

Программа должна пинговать компьютер в сети TCP/IP автоматически через определенные промежутки времени. Подскажите API-функцию для поссылки пакетов? Если можно пример.
Netscape, Ping, IP Tools, MS IE - не по теме!


 
Polevi ©   (2002-08-28 11:37) [5]

>Подскажите API-функцию для поссылки пакетов?
send


 
Malder ©   (2002-08-28 12:58) [6]

ICMP API

Определения типов и прототипы функций для Microsoft icmp.dll:


type
ip_option_information = packed record // Информация заголовка IP (Наполнение
// этой структуры и формат полей описан в RFC791.
Ttl : byte; // Время жизни (используется traceroute-ом)
Tos : byte; // Тип обслуживания, обычно 0
Flags : byte; // Флаги заголовка IP, обычно 0
OptionsSize : byte; // Размер данных в заголовке, обычно 0, максимум 40
OptionsData : Pointer; // Указатель на данные
end;

icmp_echo_reply = packed record
Address : u_long; // Адрес отвечающего
Status : u_long; // IP_STATUS (см. ниже)
RTTime : u_long; // Время между эхо-запросом и эхо-ответом
// в миллисекундах
DataSize : u_short; // Размер возвращенных данных
Reserved : u_short; // Зарезервировано
Data : Pointer; // Указатель на возвращенные данные
Options : ip_option_information; // Информация из заголовка IP
end;

PIPINFO = ^ip_option_information;
PVOID = Pointer;

function IcmpCreateFile() : THandle; stdcall; external "ICMP.DLL" name "IcmpCreateFile";
function IcmpCloseHandle(IcmpHandle : THandle) : BOOL; stdcall; external "ICMP.DLL" name "IcmpCloseHandle";
function IcmpSendEcho(
IcmpHandle : THandle; // handle, возвращенный IcmpCreateFile()
DestAddress : u_long; // Адрес получателя (в сетевом порядке)
RequestData : PVOID; // Указатель на посылаемые данные
RequestSize : Word; // Размер посылаемых данных
RequestOptns : PIPINFO; // Указатель на посылаемую структуру
// ip_option_information (может быть nil)
ReplyBuffer : PVOID; // Указатель на буфер, содержащий ответы.
ReplySize : DWORD; // Размер буфера ответов
Timeout : DWORD // Время ожидания ответа в миллисекундах
) : DWORD; stdcall; external "ICMP.DLL" name "IcmpSendEcho";


Функция IcmpSendEcho() посылает ICMP эхо-запрос по заданному IP адресу и помещает все ответы, полученные за время заданного таймаута, в буфер ответов (ReplyBuffer). Перед использованием функций Icmp.dll необходимо вызвать функцию WSAStartup() из Winsock.
Если этого не сделать, то первый же вызов функции IcmpSendEcho() приведет к ошибке 10091 (WSASYSNOTREADY).

Следует заметить, что ответы, помещенные в буфер, необязательно будут сообщениями "эхо-ответ". Возможно, что в ответ на "эхо-запрос" придут сообщения ICMP о возникших ошибках. Естественно, эти сообщения так же будут помещены в ReplyBuffer.


 
Malder ©   (2002-08-28 12:58) [7]

Ниже приведен базовый фрагмент кода, необходимый для однократного посыла эхо-запроса:


procedure TForm1.Button1Click(Sender: TObject);
var
hIP : THandle;
pingBuffer : array [0..31] of Char;
pIpe : ^icmp_echo_reply;
pHostEn : PHostEnt;
wVersionRequested : WORD;
lwsaData : WSAData;
error : DWORD;
destAddress : In_Addr;
begin

// Создаем handle
hIP := IcmpCreateFile();

GetMem( pIpe,
sizeof(icmp_echo_reply) + sizeof(pingBuffer));
pIpe.Data := @pingBuffer;
pIpe.DataSize := sizeof(pingBuffer);

wVersionRequested := MakeWord(1,1);
error := WSAStartup(wVersionRequested,lwsaData);
if (error <> 0) then
begin
Memo1.SetTextBuf("Error in call to "+
"WSAStartup().");
Memo1.Lines.Add("Error code: "+IntToStr(error));
Exit;
end;

pHostEn := gethostbyname("delphi.mastak.com");
error := GetLastError();
if (error <> 0) then
begin
Memo1.SetTextBuf("Error in call to"+
"gethostbyname().");
Memo1.Lines.Add("Error code: "+IntToStr(error));
Exit;
end;

destAddress := PInAddr(pHostEn^.h_addr_list^)^;

// Посылаем ping-пакет
Memo1.Lines.Add("Pinging " +
pHostEn^.h_name+" ["+
inet_ntoa(destAddress)+"] "+
" with "+
IntToStr(sizeof(pingBuffer)) +
" bytes of data:");

IcmpSendEcho(hIP,
destAddress.S_addr,
@pingBuffer,
sizeof(pingBuffer),
Nil,
pIpe,
sizeof(icmp_echo_reply) + sizeof(pingBuffer),
5000);

error := GetLastError();
if (error <> 0) then
begin
Memo1.SetTextBuf("Error in call to "+
"IcmpSendEcho()");
Memo1.Lines.Add("Error code: "+IntToStr(error));
Exit;
end;

// Смотрим некоторые из вернувшихся данных
Memo1.Lines.Add("Reply from "+
IntToStr(LoByte(LoWord(pIpe^.Address)))+"."+
IntToStr(HiByte(LoWord(pIpe^.Address)))+"."+
IntToStr(LoByte(HiWord(pIpe^.Address)))+"."+
IntToStr(HiByte(HiWord(pIpe^.Address))));
Memo1.Lines.Add("Reply time: "+IntToStr(pIpe.RTTime)+" ms");

IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
end;



Разумеется, это только "скелет". Многие возможные ошибки не обрабатываются.Для работы этого фрагмента надо:


создать форму TForm1;
включить в раздел Uses юнит WinSock;
поместить на форму компонент Memo1:TMemo и кнопку Button1:TButton;
в разделе Implementation поместить описания типов и функций Icmp.dll (см. выше);
сопоставить событию OnClick кнопки приведенную функцию.


 
Malder ©   (2002-08-28 13:01) [8]

От себя: и все это надо связать с таймером, чтобы пинговать каждый t минут.

Не так уж и сложно


 
Витёк ©   (2002-08-29 02:22) [9]

Спасибо, красиво работает!
У Вас написано, что многие возможные ошибки не обрабатываются. Мне не удалось вызвать ни одной исключительной ситуации :-(
Подскажите ошибочку!


 
Wonder ©   (2002-08-29 11:34) [10]

Ну, например, тут неправильно реализована проверка на ошибку при вызове gethostbyname(). Да и при вызове IcmpSendEcho() тоже.

Надо посмотреть описание указанных ф-ций и переделать как должно быть.



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

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

Наверх




Память: 0.49 MB
Время: 0.009 c
1-101259
Inan61
2002-10-18 22:20
2002.10.31
Random Как сделать?


1-101326
gerkon
2002-10-20 14:45
2002.10.31
повтор процедур.


1-101187
bobr12
2002-10-21 11:02
2002.10.31
Есть ли в Delphi функция для решения уравнений?


1-101192
YriyR
2002-10-21 13:56
2002.10.31
Ещё раз бегущая строка


3-101113
malex_1
2002-10-08 08:31
2002.10.31
OleDB Provider for ODBC/Microsoft Visual FoxPro Driver