Форум: "Начинающим";
Текущий архив: 2010.09.26;
Скачать: [xml.tar.bz2];
Внизпинг хоста Найти похожие ветки
← →
linuxoid (2010-06-30 15:22) [0]здравствуйте!
Хочу сделать сделать прогу для пинга хостов.
имеется форма на ней кнопки "добавить", "стоп " и MEMO. при его нажатии чтоб открывалась другая форма на которой чтоб были 2 текстовых поля для ввода ip хоста и для ввода таймаута и кнопка "добавить хост". по нажатии "добавить хост" на MEMO в главной форме шел пинг этого хоста.
ну и по нажатии "стоп" программа прекращала пинг.
Заранее благодарю
← →
linuxoid (2010-06-30 15:23) [1]Как это все реализовать?
← →
И. Павел © (2010-06-30 15:55) [2]Пинг средствами Delphi:
http://www.google.ru/search?hl=ru&source=hp&q=%D0%BF%D0%B8%D0%BD%D0%B3+Delphi&aq=f&aqi=&aql=&oq=&gs_rfai=
← →
Anatoly Podgoretsky © (2010-06-30 16:06) [3]> linuxoid (30.06.2010 15:23:01) [1]
Ты не настоящий Линуксоид, настоящий использует то что уже есть в системе,
оно кстати полностью решает задачу и даже более.
← →
brother © (2010-06-30 16:10) [4]unit pingModule;
interface
uses icmp, Windows;
const
INADDR_NONE: integer = -1;
procedure Ping (const Address, EchoString: PChar;var PingReply: TsmICMP_Echo_Reply;
const PingTimeout: Integer = 500);
function PingStatusToStr (StatusCode: integer): string;
function inet_addr (IPAddress: PChar): TipAddr; StdCall;
implementation
uses Dialogs, SysUtils;
procedure Ping (const Address, EchoString: PChar;
var PingReply: TsmICMP_Echo_Reply;
const PingTimeout: Integer = 500);
var
IPAddress: TipAddr;
ICMPPort: THandle;
begin
IPAddress:= inet_addr (Address);
if (IPAddress = INADDR_NONE) then
begin
raise Exception.Create ("Function call inet_addr failed. " +
"The IP address is probably invalid.");
end;
ICMPPort:= IcmpCreateFile ();
if (ICMPPort = INVALID_HANDLE_VALUE) then
begin
raise Exception.Create ("Function call IcmpCreateFile failed.");
end;
IcmpSendEcho (ICMPPort, IPAddress,
EchoString, Length (EchoString), nil,
@PingReply, SizeOf (PingReply), PingTimeout);
IcmpCloseHandle (ICMPPort);
end;
function PingStatusToStr (StatusCode: integer): string;
begin
case (StatusCode) of
IP_SUCCESS: Result:= "IP_SUCCESS";
IP_BUF_TOO_SMALL: Result:= "IP_BUF_TOO_SMALL";
IP_DEST_NET_UNREACHABLE: Result:= "IP_DEST_NET_UNREACHABLE";
IP_DEST_HOST_UNREACHABLE: Result:= "IP_DEST_HOST_UNREACHABLE";
IP_DEST_PROT_UNREACHABLE: Result:= "IP_DEST_PROT_UNREACHABLE";
IP_DEST_PORT_UNREACHABLE: Result:= "IP_DEST_PORT_UNREACHABLE";
IP_NO_RESOURCES: Result:= "IP_NO_RESOURCES";
IP_BAD_OPTION: Result:= "IP_BAD_OPTION";
IP_HW_ERROR: Result:= "IP_HW_ERROR";
IP_PACKET_TOO_BIG: Result:= "IP_PACKET_TOO_BIG";
IP_REQ_TIMED_OUT: Result:= "IP_REQ_TIMED_OUT";
IP_BAD_REQ: Result:= "IP_BAD_REQ";
IP_BAD_ROUTE: Result:= "IP_BAD_ROUTE";
IP_TTL_EXPIRED_TRANSIT: Result:= "IP_TTL_EXPIRED_TRANSIT";
IP_TTL_EXPIRED_REASSEM: Result:= "IP_TTL_EXPIRED_REASSEM";
IP_PARAM_PROBLEM: Result:= "IP_PARAM_PROBLEM";
IP_SOURCE_QUENCH: Result:= "IP_SOURCE_QUENCH";
IP_OPTION_TOO_BIG: Result:= "IP_OPTION_TOO_BIG";
IP_BAD_DESTINATION: Result:= "IP_BAD_DESTINATION";
IP_ADDR_DELETED: Result:= "IP_ADDR_DELETED";
IP_SPEC_MTU_CHANGE: Result:= "IP_SPEC_MTU_CHANGE";
IP_MTU_CHANGE: Result:= "IP_MTU_CHANGE";
IP_UNLOAD: Result:= "IP_UNLOAD";
IP_GENERAL_FAILURE: Result:= "IP_GENERAL_FAILURE";
else
Result:= "";
end;
end;
function inet_addr; external "WSock32.Dll";
end.
← →
brother © (2010-06-30 16:11) [5]unit icmp;
interface
uses windows;
Const
// IP_STATUS codes returned from IP APIs
IP_STATUS_BASE = 11000;
IP_SUCCESS = 0;
IP_BUF_TOO_SMALL = (IP_STATUS_BASE + 1);
IP_DEST_NET_UNREACHABLE = (IP_STATUS_BASE + 2);
IP_DEST_HOST_UNREACHABLE = (IP_STATUS_BASE + 3);
IP_DEST_PROT_UNREACHABLE = (IP_STATUS_BASE + 4);
IP_DEST_PORT_UNREACHABLE = (IP_STATUS_BASE + 5);
IP_NO_RESOURCES = (IP_STATUS_BASE + 6);
IP_BAD_OPTION = (IP_STATUS_BASE + 7);
IP_HW_ERROR = (IP_STATUS_BASE + 8);
IP_PACKET_TOO_BIG = (IP_STATUS_BASE + 9);
IP_REQ_TIMED_OUT = (IP_STATUS_BASE + 10);
IP_BAD_REQ = (IP_STATUS_BASE + 11);
IP_BAD_ROUTE = (IP_STATUS_BASE + 12);
IP_TTL_EXPIRED_TRANSIT = (IP_STATUS_BASE + 13);
IP_TTL_EXPIRED_REASSEM = (IP_STATUS_BASE + 14);
IP_PARAM_PROBLEM = (IP_STATUS_BASE + 15);
IP_SOURCE_QUENCH = (IP_STATUS_BASE + 16);
IP_OPTION_TOO_BIG = (IP_STATUS_BASE + 17);
IP_BAD_DESTINATION = (IP_STATUS_BASE + 18);
// The next group are status codes passed up on status indications to
// transport layer protocols.
IP_ADDR_DELETED = (IP_STATUS_BASE + 19);
IP_SPEC_MTU_CHANGE = (IP_STATUS_BASE + 20);
IP_MTU_CHANGE = (IP_STATUS_BASE + 21);
IP_UNLOAD = (IP_STATUS_BASE + 22);
IP_GENERAL_FAILURE = (IP_STATUS_BASE + 50);
MAX_IP_STATUS = IP_GENERAL_FAILURE;
IP_PENDING = (IP_STATUS_BASE + 255);
// Values used in the IP header Flags field.
IP_FLAG_DF = $2; // Don"t fragment this packet.
// Supported IP Option Types.
// These types define the options which may be used in the OptionsData field
// of the ip_option_information structure. See RFC 791 for a complete
// description of each.
IP_OPT_EOL = 0; // End of list option
IP_OPT_NOP = 1; // No operation
IP_OPT_SECURITY = $82; // Security option
IP_OPT_LSRR = $83; // Loose source route
IP_OPT_SSRR = $89; // Strict source route
IP_OPT_RR = $7; // Record route
IP_OPT_TS = $44; // Timestamp
IP_OPT_SID = $88; // Stream ID (obsolete)
MAX_OPT_SIZE = 40; // Maximum length of IP options in bytes
Type
TIPAddr=integer; // An IP address.
TIPMask=integer; // An IP subnet mask.
TIP_STATUS=Integer; // Status code returned from IP APIs.
POption_Information=^TOption_Information;
TOption_Information=record
Ttl:byte; // Time To Live
Tos:byte; // Type Of Service
Flags:byte; // IP header flags
OptionsSize:byte; // Size in bytes of options data
OptionsData:pointer; // Pointer to options data
end;
Picmp_echo_reply=^Ticmp_echo_reply;
Ticmp_echo_reply=record
Address:TipAddr; // Replying address
Status:integer; // Reply IP_STATUS
RoundTripTime:integer; // RTT in milliseconds
DataSize:word; // Reply data size in bytes
Reserved:word; // Reserved for system use
Data:pointer; // Pointer to the reply data
Options:Toption_Information; // Reply options
end;
TsmICMP_Echo_Reply=record
Address:TipAddr; // Replying address
Status:integer; // Reply IP_STATUS
RoundTripTime:integer; // RTT in milliseconds
DataSize:word; // Reply data size in bytes
Reserved:word; // Reserved for system use
DataPtr:pointer; // Pointer to the reply data
Options:Toption_Information; // Reply options
Data: array [0..255] of Char;
end;
function IcmpCreateFile:Thandle; StdCall;
function IcmpCloseHandle (H:Thandle):Bool; StdCall;
function IcmpSendEcho (IcmpHandle:Thandle;DestinationAddress:TipAddr;
RequestData:pointer;RequestSize:word;
RequestOptions:POption_Information;ReplyBuffer:pointer;
ReplySize:integer;Timeout:integer):Integer; stdcall;
Implementation
function IcmpCreateFile; external "Icmp.Dll";
function IcmpCloseHandle; external "Icmp.Dll";
Function IcmpSendEcho; external "Icmp.Dll";
end.
← →
Плохиш © (2010-06-30 16:11) [6]
> linuxoid (30.06.10 15:23) [1]
>
> Как это все реализовать?
Так же как ты и описал, только переведя текст в термины синтаксиса делфи.
← →
brother © (2010-06-30 16:12) [7]пример использования:
procedure TForm1.Timer1Timer(Sender: TObject);
var Reply:TsmICMP_Echo_Reply;
begin
Ping (pchar("10.1.1.1),nil,Reply, 500);
if reply.Status=IP_SUCCESS then CheckBox1.Checked:=true
else CheckBox1.Checked:=false;
end;
← →
brother © (2010-06-30 16:12) [8]зы интерфейс уж сам)
← →
Игорь Шевченко © (2010-06-30 16:43) [9]
> if reply.Status=IP_SUCCESS then CheckBox1.Checked:=true
> else CheckBox1.Checked:=false;
>
сильно
← →
Германн © (2010-06-30 17:28) [10]
>
> > if reply.Status=IP_SUCCESS then CheckBox1.Checked:=true
> > else CheckBox1.Checked:=false;
>
> >
>
>
> сильно
>
Не очень. Вот если бы он ещё выражение в скобки заключил, тогда да!
← →
brother © (2010-07-01 04:48) [11]> сильно
зато наглядно ;)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.09.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c