Einzelnen Beitrag anzeigen

LAWn-M0W3R

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

Ping Bitte um Erläuterung

  Alt 18. Nov 2006, 20:00
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 habe ich mal im Web gefunden, sie funktioniert auch super, aber ich weiß nicht wie (Das muss ich aber genau wissen, um sie vorzustellen!).

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.
Ich habe mich leider noch nie mit Records beschäftigt (mache ich aber sofort) und weiß auch nicht, was 'stdcall' heißt.
Vielen Dank schon mal im Vorraus für die Hilfe!!!

Viele Grüße vom LAWn-M0W3R