Hallo,
ich habe eine dringende Bitte: Ich muss am Montag zwei Stunden lang meinen Mitschülern im Informatikunterricht objektorientiertes Programmieren erklären. Die erste Stunde mache ich Definitionen, Diagramme und wichtige Methoden und die zweite Stunde möchte ich eben mit ihnen zusammen ein Programm erarbeiten, dass einen Ping über die icmp.dll durchführt. Ich habe bereits einen Button selber gemacht (wegen Klassen und so). Die Ping-Prozedur ist eigentlich nebensächlich, aber ich muss eben noch irgendetwas mit diesem Button machen und außerdem interessiert mich der Ping sowieso. Meinen letzter Thread wurde vom Moderator geschlossen, weil er mir vorwarf hierdraus ein Hausaufgabenforum zu machen, aber darum geht es eben nicht: Ich habe schon alles andere vorbereitet und es geht ja eigentlich nur ums Klassen-Programmieren. Die Ping-Prozedur ist ein interessanter Zusatz und delphipraxis.de wird natürlich auch als Quelle angegeben. Desweiteren ist unser Schulnetzwerk sehr schlecht geschützt und ich möchte versuchen das unserem Informatiklehrer zu zeigen, indem ich in dem Programm dann übergroße Pings auf den Server loslasse und er sie durchlassen wird
(natürlich nur, wenn er mir das gestattet).
An den Moderator: Bitte schließen sie meinen Thread nicht! Diese Prozedur ist nur ein geringer Zusatz, der im Rahmen eines Vortrages über Klassen nebensächlich ist und nur für mich und für uns als Schüler interessant ist.
Ich wäre euch total dankbar, wenn sich bis morgen Abend
einer findet, der sich die Mühe machen würde den folgenden Quelltext zu kommentieren!
Delphi-Quellcode:
unit Unit2;
interface
uses
Windows, SysUtils, Classes;
type
TSunB =
packed record
s_b1, s_b2, s_b3, s_b4: byte;
end;
TSunW =
packed record
s_w1, s_w2: word;
end;
PIPAddr = ^TIPAddr;
TIPAddr =
record
case integer
of
0: (S_un_b: TSunB);
1: (S_un_w: TSunW);
2: (S_addr: longword);
end;
IPAddr = TIPAddr;
function IcmpCreateFile : THandle;
stdcall;
external '
icmp.dll';
function IcmpCloseHandle (icmpHandle : THandle) : boolean;
stdcall;
external '
icmp.dll'
function IcmpSendEcho
(IcmpHandle : THandle; DestinationAddress : IPAddr;
RequestData : Pointer; RequestSize : Smallint;
RequestOptions : pointer;
ReplyBuffer : Pointer;
ReplySize : DWORD;
Timeout : DWORD) : DWORD;
stdcall;
external '
icmp.dll';
function Ping(InetAddress :
string) : boolean;
implementation
uses
WinSock;
procedure TranslateStringToTInAddr(AIP:
string;
var AInAddr);
var
phe: PHostEnt;
pac: PChar;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
try
phe := GetHostByName(PChar(AIP));
if Assigned(phe)
then
begin
pac := phe^.h_addr_list^;
if Assigned(pac)
then
begin
with TIPAddr(AInAddr).S_un_b
do begin
s_b1 := Byte(pac[0]);
s_b2 := Byte(pac[1]);
s_b3 := Byte(pac[2]);
s_b4 := Byte(pac[3]);
end;
end
else
begin
raise Exception.Create('
Error getting IP from HostName');
end;
end
else
begin
raise Exception.Create('
Error getting HostName');
end;
except
FillChar(AInAddr, SizeOf(AInAddr), #0);
end;
WSACleanup;
end;
function Ping(InetAddress :
string) : boolean;
var
Handle : THandle;
InAddr : IPAddr;
DW : DWORD;
rep :
array[1..128]
of byte;
begin
result := false;
Handle := IcmpCreateFile;
if Handle = INVALID_HANDLE_VALUE
then
Exit;
TranslateStringToTInAddr(InetAddress, InAddr);
DW := IcmpSendEcho(
Handle, InAddr,
nil, 0,
nil, @rep, 128, 0);
Result := (DW <> 0);
IcmpCloseHandle(
Handle);
end;
end.
Vielen Dank schon mal im Vorraus für die Hilfe!!!
Viele Grüße vom LAWn-M0W3R