Форум: "Сети";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];
ВнизКак пинговать компьютер 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c