Форум: "KOL";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизPING Найти похожие ветки
← →
Deimos © (2004-05-21 14:47) [0]как организовать PING средствами KOL ?
← →
Gandalf © (2004-05-21 15:48) [1]В KOLIndy несмотря на то что он закрыт ping пашет, в KOLICS тоже...
Последний работает через icmp.dll потом блокируемый.
← →
Deimos © (2004-05-30 01:16) [2]При попытке компиляции с использованием KOLICS компилятор выдает трёхэтажный мат по поводу KOLSysUtils мол, ошибки там.. и прочее
в чем дело??
KOLSysUtils лежал в пачке вместе с KOLICS.
компилятор - Delphi 5 + KOL 1.91
← →
salut (2004-05-30 20:30) [3]comment on peut faire un proramme de ping avec delphi
est que il ya un composant delphi qui nous aide.
merci
← →
Deimos © (2004-05-31 15:58) [4]господа, если кто может перевести, переведите пожалуйста, а то я кроме английского и финского больше языков не знаю :((
← →
Viman © (2004-06-01 11:01) [5]2 Deimos
Не волнуйся, там похоже ничего существенного нет, на выпендреж смахивает :)
Найди если не знаешь как воспользоваться KOLIndy или KOLICS, то найди в инете на компонентик для ping(или исходник модуля(функции) просто - бывает)и переделай под KOL - изменения в отличие от Indy и ICS будут минимальными.
← →
Gandalf © (2004-06-01 11:17) [6]Под delphi5 нужен исправленый KOLSysutils
← →
Deimos © (2004-06-02 00:50) [7]как понять "исправленный " ?
← →
maxx0 (2004-06-02 09:49) [8]Зачем, простите, нужен КОЛ если это всё на API делается. Пример здесь же на сайте лежит. Адрес не помню, но поиск есть... На его основе сделано (почти без изменений):
unit ICMP;
interface
uses
Windows, SysUtils, WinSock;
function ICMPInit(var ErrorMessage:String):Boolean;
function ICMPPing(Host:String;var ErrorMessage:String):Boolean;
function HostNameByAddress(Address:Integer):String;
function IpToString(IP:Cardinal):String;
type
// Информация заголовка IP (Наполнение этой структуры и формат полей описан в RFC791.
ip_option_information=packed record
Ttl:Byte; // Время жизни (используется traceroute-ом)
Tos:Byte; // Тип обслуживания, обычно 0
Flags:Byte; // Флаги заголовка IP, обычно 0
OptionsSize:Byte; // Размер данных в заголовке, обычно 0, максимум 40
OptionsData:Pointer;// Указатель на данные
end;
icmp_echo_reply=packed record
Address:Cardinal; // Адрес отвечающего
Status:Cardinal; // IP_STATUS (см. ниже)
RTTime:Cardinal; // Время между эхо-запросом и эхо-ответом в миллисекундах
DataSize:Word; // Размер возвращенных данных
Reserved:Word; // Зарезервировано
Data:Pointer; // Указатель на возвращенные данные
Options:ip_option_information; // Информация из заголовка IP
end;
PIPINFO=^ip_option_information;
PVOID=Pointer;
TIcmpCreateFile=function:THandle;stdcall;
TIcmpCloseHandle=function(IcmpHandle:THandle):BOOL;stdcall;
TIcmpSendEcho=function(IcmpHandle:THandle; // handle, возвращенный IcmpCreateFile()
DestAddress:Cardinal; // Адрес получателя (в сетевом порядке)
RequestData:PVOID; // Указатель на посылаемые данные
RequestSize:Word; // Размер посылаемых данных
RequestOptns:PIPINFO; // Указатель на посылаемую структуру
// ip_option_information (может быть nil)
ReplyBuffer:PVOID; // Указатель на буфер, содержащий ответы.
ReplySize:DWORD; // Размер буфера ответов
Timeout:DWORD // Время ожидания ответа в миллисекундах
):DWORD;stdcall;
var
IcmpCreateFile:TIcmpCreateFile;
IcmpCloseHandle:TIcmpCloseHandle;
IcmpSendEcho:TIcmpSendEcho;
LibraryIsLoaded:Boolean=False;
hLib:THandle;
implementation
function GetLastErrorMsg(Error:Cardinal):String;overload;
var
Msg:array [Byte] of Char;
begin
Error:=GetLastError;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,nil,Error,0,@Msg,255,nil);
Result:=StrPas(@Msg);
end;
function GetLastErrorMsg:String;overload;
var
Error:Cardinal;
begin
Error:=GetLastError;
Result:=GetLastErrorMsg(Error);
end;
function IpToString(IP:Cardinal):String;
var
IPArr:packed record
a4,a3,a2,a1:Byte;
end absolute IP;
begin
Result:=Format("%d.%d.%d.%d",[IPArr.a4,IPArr.a3,IPArr.a2,IPArr.a1]);
end;
function HostNameByAddress(Address:Integer):String;
var
HostEnt:PHostEnt;
begin
Result:="";
HostEnt:=GetHostByAddr(@Address,4,PF_INET);
if HostEnt<>nil then
Result:=HostEnt^.h_name;
end;
function ICMPInit(var ErrorMessage:String):Boolean;
const
ModuleName="icmp.dll";
sIcmpCreateFile="IcmpCreateFile";
sIcmpCloseHandle="IcmpCloseHandle";
sIcmpSendEcho="IcmpSendEcho";
var
lwsaData:WSAData;
begin
ErrorMessage:="";
Result:=False;
hLib:=LoadLibrary("icmp.dll");
if hLib=0 then begin
ErrorMessage:=GetLastErrorMsg+" ("+ModuleName+")";
Exit;
end;
IcmpCreateFile:=GetProcAddress(hLib,sIcmpCreateFile);
if @IcmpCreateFile=nil then begin
ErrorMessage:=sIcmpCreateFile+": "+GetLastErrorMsg;
Exit;
end;
IcmpCloseHandle:=GetProcAddress(hLib,sIcmpCloseHandle);
if @IcmpCreateFile=nil then begin
ErrorMessage:=sIcmpCloseHandle+": "+GetLastErrorMsg;
Exit;
end;
IcmpSendEcho:=GetProcAddress(hLib,sIcmpSendEcho);
if @IcmpCreateFile=nil then begin
ErrorMessage:=sIcmpSendEcho+": "+GetLastErrorMsg;
Exit;
end;
Result:=True;
LibraryIsLoaded:=True;
if Result then begin
WSAStartup($0101,lwsaData);
end;
end;
function ICMPPing(Host:String;var ErrorMessage:String):Boolean;
var
hIP:THandle;
pingBuffer:array [0..31] of Char;
pIpe:^icmp_echo_reply;
pHostEn:PHostEnt;
lwsaData:WSAData;
Error:DWORD;
destAddress:In_Addr;
wVersionRequested : WORD;
begin
Result:=False;
// Создаем 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
ErrorMessage:=Trim(GetLastErrorMsg);
Exit;
end;
pHostEn:=gethostbyname(PChar(Host));
Error:=GetLastError();
if (Error<>0) then begin
ErrorMessage:=Trim(GetLastErrorMsg(Error))+" "+Host;
Exit;
end;
destAddress:=PInAddr(pHostEn^.h_addr_list^)^;
IcmpSendEcho(hIP,
destAddress.S_addr,
@pingBuffer,
sizeof(pingBuffer),
nil,
pIpe,
sizeof(icmp_echo_reply) + sizeof(pingBuffer),
5000);
Error:=GetLastError();
if (Error<>0) then begin
ErrorMessage:=Trim(GetLastErrorMsg(Error));
Exit;
end;
ErrorMessage:="Ответ от "+
IntToStr(LoByte(LoWord(pIpe^.Address)))+"."+
IntToStr(HiByte(LoWord(pIpe^.Address)))+"."+
IntToStr(LoByte(HiWord(pIpe^.Address)))+"."+
IntToStr(HiByte(HiWord(pIpe^.Address)))+
" Время ответа: "+IntToStr(pIpe.RTTime)+" мсек";
IcmpCloseHandle(hIP);
WSACleanup();
FreeMem(pIpe);
Result:=True;
end;
end.
Сначала ICMPInit, потом ICMPPing
← →
maxx0 (2004-06-02 09:52) [9]Забыл сказать, что то лучше в отельном потоке делать :)
← →
Gandalf © (2004-06-02 20:01) [10]Пожалуй уже не в тему... icmp.dll тормознуто и блокируемо.
ЗЫ: Правда ICS так же сделано - я спрашивал автора, он говорит - меня все устраивает, а делать на RAW сокетах лень... В indy там постарались :)
← →
iddqd (2004-06-03 13:15) [11]Если ещё интересно, то вот есть пример:
исходники - http://www.zahodi.o5.ru/files/pingator_sources.rar
exe-шник - http://www.zahodi.o5.ru/files/pingator.rar
← →
Deimos © (2004-06-04 00:39) [12]хм .. спасибо..
но кстати я слышал что майкрософт не собирается поддерживать icmp.dll в следующих версиях винд..
и вполне возможно, что один из следующих сервис-паков его уберет и из XP...
может на raw сокетах есть пример у кого ?
все unix-ы через них пингуют.. чем винды хуже ??
← →
Gandalf © (2004-06-04 18:40) [13]Indy разгреби... там это не сложно, в инете море примеров пинговалок, бери любую на api. Когда icmp.dll уберут ICS обновиться :) Если совсем лень могу порыть - но потоки сам будешь прикручивать :)
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.073 c