Текущий архив: 2004.10.24;
Скачать: CL | DM;
Внизутилита для пингования Найти похожие ветки
← →
bles (2004-08-12 04:24) [0]Коллеги! У меня WAN сеть, на ее концах сидят домохозяйки. Требуется очень дружественная утилита для пингованяи сети со стороны клиента. Воспользовался компонентом IdIcmpClient на вкладке Indy Clients. Отлично все работает, но только под Администратором, а под Юзером не хочет, пишет ...socket error...Access denied.
Может подскажете другой способ пингования. Или как этому компоненту разрешить пинговать от Юзера? Ответ типа ... посмотри политики безопасности неподходит.
← →
TUser © (2004-08-12 04:47) [1]
> Или как этому компоненту разрешить пинговать от Юзера?
не работал я с indy, но думаю, что в больей степени это зависит от настроек системы, чем от компонента.
← →
Fay © (2004-08-12 06:56) [2]Попробуй synapse или ics
← →
TUser © (2004-08-12 07:08) [3]Там скорее всего обнаружится такая же фича. Видимо юзеру не позволено этого делать.
← →
Fay © (2004-08-12 07:11) [4]Написать службу, установить её под админом, юзать по юзерами, идти пить пиво.
← →
Anatoly Podgoretsky © (2004-08-12 09:21) [5]Зачем домохозяйкам пинговать, делать им больше нечего.
← →
Vlad Oshin © (2004-08-12 10:12) [6]запустить процесс от имени
попробовать вызвать ping.exe с перенаправлением
← →
REA © (2004-08-12 10:25) [7]Вот, например. Насчет дружественности не знаю.
Unit ICMP;
Interface
Uses Windows, Winsock, SysUtils;
Type
PIPOptions = ^TIPOptions;
TIPOptions = Packed Record
Ttl: Byte; // time to live
Tos: Byte; // type of service (usually 0)
Flags: Byte; // IP header flags (usually 0)
OptionsSize: Byte; // size of options data (usually 0, max 40)
OptionsData: Pointer; // options data buffer
End;
PICMPEchoReply = ^TICMPEchoReply;
TICMPEchoReply = Packed Record
Address : Cardinal; // source address
Status : Cardinal; // IP status
Rttime : Cardinal; // rount trip time in milliseconds
Datasize: Word; // reply data size
Reserved: Word; // who knows
Data : Pointer; // reply data buffer
Ip_options:TIPOptions; // reply options
End;
Const ICMPDLL = "ICMP.DLL";
Function ICMPCreateFile:THandle; Stdcall; External ICMPDLL Name "IcmpCreateFile";
Function ICMPCloseHandle(ICMPHandle: THandle):Boolean; Stdcall; External ICMPDLL Name "IcmpCloseHandle";
Function ICMPSendEcho(ICMPHandle: THandle; // handle returned from ICMPCreateHandle
DestAddress: Longint; // destination IP address (network order)
RequestData: Pointer; // pointer to buffer to send
RequestSize: Word; // length of data in buffer
RequestOptns: PIPOptions;
ReplyBuffer: Pointer; // see note
Replysize: DWORD; // length of reply, minimum 1 reply
Timeout: DWORD // time in milliseconds to wait for reply
):DWORD; Stdcall; External ICMPDLL Name "IcmpSendEcho";
Function Ping(Host: String; Var PingTime: Integer; BlockSize, Timeout, TimeToLive: Integer): Boolean;
Implementation
Var WSAData: TWSAData;
Function Ping(Host: String; Var PingTime: Integer; BlockSize, Timeout, TimeToLive: Integer): Boolean;
Var ICMPHandle: THandle;
RequestData, ReplyBuffer: Pointer;
ReplySize: Integer;
RequestOptions: TIPOptions;
Address: Longint;
RemoteHost: PHostEnt;
Begin
Result := False;
Try
Address := Winsock.Inet_Addr(PChar(Host));
If (Address = SOCKET_ERROR) Then
Begin
RemoteHost:= Winsock.GetHostByName(PChar(Host));
If (RemoteHost=Nil) Or (RemoteHost^.h_length<=0) Then Raise Exception.Create("Invalid host");
Address := Longint(Pointer(RemoteHost^.h_addr_list^)^);
End;
ICMPHandle := ICMPCreateFile;
ReplySize:=16 + Sizeof(TICMPEchoReply) + BlockSize;
GetMem(RequestData,BlockSize);
FillChar(RequestData^,BlockSize,#0);
GetMem(ReplyBuffer,ReplySize);
Try
With RequestOptions Do
Begin
TTL := TimeToLive; // a ping should live near infinity
TOS := 0;
Flags:= 0;
OptionsSize:=0;
OptionsData:=Nil;
End;
If ICMPSendEcho(ICMPHandle,Address,RequestData,BlockSize,
@RequestOptions,ReplyBuffer,ReplySize,
Timeout) = 1 Then
With PICMPEchoReply(ReplyBuffer)^ Do
Begin
Result := (Status = 0);
PingTime := RTTime;
End;
Finally
FreeMem(RequestData);
FreeMem(ReplyBuffer);
ICMPCloseHandle(ICMPHandle);
End;
Except End;
End;
Procedure Startup;
Var
ErrorCode: Integer;
Begin
ErrorCode := WSAStartup($0101, WSAData);
If ErrorCode <> 0 Then Raise Exception.Create("WSAStartup bug");
End;
Procedure Cleanup;
Var
ErrorCode: Integer;
Begin
ErrorCode := WSACleanup;
If ErrorCode <> 0 Then Raise Exception.Create("WSACleanup bug");
End;
Initialization
Startup;
Finalization
Cleanup;
End.
← →
Alex Konshin © (2004-08-12 10:26) [8]Кого пинговать надо?
Используй UDP.
← →
bles (2004-08-13 07:30) [9]Огромное спасибо REA.
Кокретный ответ на конкретный вопрос.
По поводу домохозяек, я могу только подсказать, что на каждый комп не хватит программеров, кто-то должен на каком нибудь полустанке вводить информацию о проходящих вагонах например. Найти на каждый пост продвинутого - не надо быть крупным руководителем, что бы понять, что это невозможно.
Вопрос ведь не стоял: надо пинговать или нет, а вопрос был: "...может кто подскажет как эту проблему решить средствами Дельфи." Как ее решить на Бэйсике я знаю, а надо на Дельфи.
С уважением,
P.S.
to РЕА надеюсь код рабочий! :-)
← →
[serzh] (2004-08-13 12:25) [10]используй TPing из ICS! У меня пинговалка именно на нем сделана!
← →
bles (2004-08-18 06:22) [11]To serzh
К сожалению не знаю, что такое ICS, это наверно Visual Component Lib?
Пожалуйста подскажите где ее взять.
С уважением,
Страницы: 1 вся ветка
Текущий архив: 2004.10.24;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.033 c