Thema: Delphi IP - Hardcore

Einzelnen Beitrag anzeigen

Benutzerbild von The-X
The-X

Registriert seit: 31. Aug 2003
Ort: Woffelsbach / user.exe ;)
377 Beiträge
 
Delphi 7 Personal
 
#15

Re: IP - Hardcore

  Alt 18. Jan 2006, 13:39
Zitat von Luckie:
Guck dich mal auf dieser Seite etwas um: http://c-worker.ch/ Da hat es auch Demos, wie man ohne Komponenten einen Ping realisiert. Das C Demo wollte ich schon längst selber mal nach Delphi übersetzten.
Luckie, Bist du schon dazu gekommen das zu übersetzen?
ich versuche mich nämlich grade auch daran, allerdings basierend auf einer anderen Quelle (SysInternals - ShareEnum\Source\Ping.cpp)
und erhalte beim Empfangen einen Fehler "WSAGetLastError: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht ordnungsgemäß reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat" dabei ist mein Router sehr wohl online sonst wär ich ja nicht hier... anbei mal den Stand der Dinge zum Pingen (Jedi-Übersetzungen von WinSock2 benötigt):
Delphi-Quellcode:
unit SockPing;

interface

uses Windows,SysUtils,JWAWinSock2;

const
  ICMP_ECHO=8;
  ICMP_ECHOREPLY=0;

type
  TIcmpHeader=Record
     i_type: Byte;                  // ICMP packet type
     i_code: Byte;                  // type subcode
     i_chksum: USHORT;               // packet checksum
     i_id: USHORT;                  // unique packet ID
     i_seq: USHORT;                  // packet sequence number
     timestamp: ULONG;               // timestamp
    data:array[0..31]of char;
  end;

function Ping(Const Server:String):boolean;

implementation

function Ping(Const Server:String):boolean;
var
  Sock:TSocket;
  Addr:TSockAddrIn;
  WD:WSAData;
  ICMPhdr:TIcmpHeader;
  datasize,fromlen,Timeout:Integer;
begin
  WSAStartup(MakeWord(2,2),WD);
  Sock:=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,nil,0,WSA_FLAG_OVERLAPPED);
  Result:=not(Sock=Invalid_Socket);
  if not Result then exit;

  TimeOut:=100;
  Result:=not(setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,@Timeout,Sizeof(Timeout))=SOCKET_ERROR);
  if not Result then exit;

  TimeOut:=100;
  Result:=not(setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,@Timeout,Sizeof(Timeout))=SOCKET_ERROR);
  if not Result then exit;

  with Addr do begin
    sin_addr.S_addr:=inet_addr(Pchar(Server));
    sin_family:=AF_INET;
  end;
  with ICMPhdr do begin
    i_type:=ICMP_ECHO;
    i_code:=0;
    i_id:=Ushort(GetCurrentProcessId);
    i_chksum:=0;
    i_seq:=0;
    timestamp:=GetTickCount;
    FillChar(data[0],32,0);
  end;

  DataSize:=Sizeof(icmphdr);
  Result:=not(sendto(Sock,ICMPhdr,DataSize,0,@Addr,Sizeof(TSockAddrIn))=SOCKET_ERROR);
  if not Result then exit;

  Result:=not(recvfrom(Sock,ICMPhdr,DataSize,0,@Addr,fromlen)=SOCKET_ERROR);
  if not Result then begin
    Writeln('Error! RecvReason: '+SysErrorMessage(WSAGetLastError));
    exit;
  end;

  closesocket(Sock);
  WSACleanup;
end;

end.
WGET ftp://root@fbi.us.gov/secret/worldreign.exe <- damit werde ich die Weltherrschaft an mich reissen!
=> irc://irc.quakenet.eu.org:6667/delphi.de da werden Sie auch (manchmal) geholfen
  Mit Zitat antworten Zitat