Thema: Delphi Ping

Einzelnen Beitrag anzeigen

LAWn-M0W3R

Registriert seit: 31. Jul 2006
Ort: Potsdam / Berlin
38 Beiträge
 
#1

Ping

  Alt 18. Nov 2006, 21:07
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