Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.01 c
3-101057
KidMan
2002-10-10 22:20
2002.10.31
SQL параметры и дата


4-101589
Klev.J
2002-09-09 19:30
2002.10.31
Hints исключительно на WIN API


1-101292
brestmarket
2002-10-19 02:53
2002.10.31
Как открыть приложением определенный файл?


14-101522
Volly
2002-10-11 14:16
2002.10.31
Как зарегистрировать программу?


3-101098
Hlor
2002-10-09 15:40
2002.10.31
Доброго времени суток! Есть вопрос... Как осуществить





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