(WinAPI) Wie finde ich meine IP im Internet herraus?

Hier kannst du häufig gestellte Fragen/Antworten und Tutorials lesen und schreiben.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

(WinAPI) Wie finde ich meine IP im Internet herraus?

Beitrag von Danilo »

Lars hat geschrieben:Zunächst einmal Suchbegriffe ;)
IP WAN Internet External

Bei dieser Frage muss man 2 Fälle unterscheiden:
1) Der Rechner hängt direkt am Internet und ist ggf. an einem LAN angeschlossen, jedoch ohne Router.

Hier kann man die IP-Adressen des Rechners durchgehen.
ExamineIPAdresses() und Konsorten sind dein Freund. Wenn du mehrere
IP Adressen bekommst, wird die Auswahl etwas problematisch. Auf jeden
Fall ist Methode 2) sicherer, jedoch auch etwas komplizierter.


2) Der Rechner geht über einen Proxy oder einen Router ins Internet

Von innen kann man die IP nicht ohne weiteres herrausfinden (Ich hätte
dazu tendiert zu sagen, dass man es nicht kann, aber die Erfahrung
lehrte mich, so etwas nie zu sagen, denn meistens findet sich doch
jemand, der einen des Gegenteiles belehrt). Deshalb muss man Auf einen
Server Im Internet connecten, der dann die IP des Stellers der Anfrage,
also dem PC, auf dem dein Programm läuft zurückgibt. Dazu gibt es dann
verschiedene Möglichkeiten. Die einfachste ist wohl ein PHP Skript,
aber auch ein selbstgeschriebener Server sollte klappen :).
In dem nachfolgendem Code habe ich mir erlaubt, einfach einen Code von
Froggerprogger zu zitieren. In dem Header des Codes findet sich auch
der PHP Code sowie die 2. Möglichkeit, www.myip.com.

Der Code ist teilweise von mir kommentiert.

Dank API ist dieser Code rein Windows, mit etwas mehr Aufwand lässt
sich das aber auch in rein PB bewerkstelligen.

Code: Alles auswählen

; IP aus dem Internet holen
; 15.04.04 by Froggerprogger
;
; nutzt entweder den Service www.myip.com oder
; das unter der Adresse http://www.2mal2mal.de/public/stuff/showIP.php abgelegte folgende PHP-Script:
;
; <html>
; <head></head>
; <body bgcolor="#000000" text="#999999">
;
; <?PHP
; $akttime=Date("d.m.Y, D, H.i.s",Time());
; echo "Serverzeit: $akttime <br>Browser-ID: $HTTP_USER_AGENT <br>Referer: $HTTP_REFERER<br>IP: $REMOTE_ADDR<br>Port: $REMOTE_PORT";
; ?>
;
; </body>
; </html>


; Diese Procedure lädt nur die angegebene Datei url.s an den
; Memorybuffer an Position *lpRam mit der Länge ramsize.
Procedure.l DownloadToMem ( url.s, *lpRam, ramsize.l )
; DownloadToMem():
; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=2808&highlight=
; Author: dige
; Date: 12. November 2003
  Protected agent.s, hINet.l, hData.l, bytes.l

  ; Datei und Internet-Verbindung öffnen
  agent.s = "Mozilla/4.0 (compatible; ST)"
  hINet.l = InternetOpen_ ( @agent.s,0,0,0,0 )
  hData.l = InternetOpenURL_ ( hINet, @url.s, "", 0, $8000000, 0 )
 
  ; Und die Datei in den Buffer lesen
  If hData > 0 : InternetReadFile_ ( hData, *lpRam, ramsize.l, @bytes.l ) : Else : bytes = -1 : EndIf
 
  ; Und alles wieder schließen
  InternetCloseHandle_ (hINet)
  InternetCloseHandle_ (hFile)
  InternetCloseHandle_ (hData)
 
  ProcedureReturn bytes.l
EndProcedure

GetIPBufferSize.l = 1000

mem.s = Space(GetIPBufferSize) ; Buffer etwas heruntergeregelt, 64K erschienen mir
                     ; unnötig

; Hier werden nur noch die Dateien in den Speicher geladen und geparsed.
If DownloadToMem ( "http://www.myip.com", @mem, GetIPBufferSize)
  ip.s = StringField(StringField(mem, 4, " "), 1, "<")
EndIf

mem.s = Space(GetIPBufferSize)
If DownloadToMem ( "http://www.2mal2mal.de/public/stuff/showIP.php", @mem, GetIPBufferSize)
  pos.l = FindString(mem, "IP: ", 1)
  ip2.s = StringField(PeekS(@mem + pos + 3), 1, "<")
EndIf
MessageRequester("","Deine IP im Internet ist:"+Chr(13)+Chr(10)+ip+" (www.myip.com)" + Chr(13)+Chr(10) +ip2+" (www.2mal2mal.de/public/stuff/showIP.php)", 0)
Man suche sich die schönere Variante aus, aber so lange man nich einen
sehr schnellen Webspace hat, ist meiner Meinung nach www.myip.com der
Vorzug zu geben, da Erreichbarkeit und Geschwindigkeit einfach höher
sind.



So weit,
Lars
Code wurde nach FroggerProgger's Ansicht berichtigt und zwei Posts wurde gelöscht
Und Lars hatte auch noch etwas auszusetzen und hat weiter repariert, entschuldigt die Unannehmlichkeiten.
Benutzeravatar
ChaOsKid
Beiträge: 66
Registriert: 29.08.2004 15:07
Wohnort: Oktoberfest

Beitrag von ChaOsKid »

hi,

ich hab da glaub ich nen fehler entdeckt, denn beim empfang von meinem router bekomme ich immer nur einen kleinen teil der html seite, das liegt daran das der router scheinbar nur recht kleine packete verschickt und die werden beim einmaligen aufruf von InternetReadFile nicht alle erwischt.
so funktioniert es bei mir allerdings problemlos:

Code: Alles auswählen

Procedure.l DownloadToMem(url.s, *ramsize.LONG)
  agent.s = "Mozilla/4.0 (compatible; ST)"
  hINet.l = InternetOpen_(@agent,0,0,0,0)
  hData.l = InternetOpenURL_(hINet, @url, "", 0, $8000000, 0)
  If hData > 0
    *lpRam = AllocateMemory(*ramsize\l)
    Repeat
      If AllBytes >= *ramsize\l
        *ramsize\l<<1
        *newRam = ReAllocateMemory(*lpRam, *ramsize\l)
        If *newRam > 0
          *lpRam = *newRam
        Else
          Debug "Speicherfehler"
          Break
        EndIf
      EndIf
      InternetReadFile_(hData, *lpRam + AllBytes, *ramsize\l - AllBytes, @bytes.l)
      AllBytes.l + bytes
    Until bytes = 0
  Else
    AllBytes = -1
  EndIf
  InternetCloseHandle_(hINet)
  InternetCloseHandle_(hFile)
  InternetCloseHandle_(hData)
  *ramsize\l = AllBytes
  If AllBytes >= 0
    ProcedureReturn ReAllocateMemory(*lpRam, AllBytes)
  Else
    FreeMemory(*lpRam)
    ProcedureReturn -1
  EndIf
EndProcedure

Size.l = 1000
*html = DownloadToMem("http://www.purebasic.de", @Size)
Debug PeekS(*html, Size)
Debug Size
edit: hab noch ein paar fehler beseitigt (11.01.2005)

mfG
Tobi
sbehrens
Beiträge: 274
Registriert: 08.09.2004 18:41
Kontaktdaten:

Beitrag von sbehrens »

www.myip.com gibt es nicht mehr! Die Seite ist ein Opfer von einer der vielen *billigen* Search-engines geworden.

mfG
Basti
enjoy life... while you can!
Antworten