öffentliche IP-Adresse ermitteln

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Hier nochmal ein Code bei dem die externe IP per RegularExpression exrahiert wird. Vermutlich nur für PB 4.3x

Der IP-String steht bei Erfolg in dem Array sIP(0).

Code: Alles auswählen

EnableExplicit

Define sHeader.s
Dim sIP.s(0)

If CreateRegularExpression(0, "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
	InitNetwork()
	
	sHeader = GetHTTPHeader("http://checkip.dyndns.org")
	;  Debug sHeader
	If ExtractRegularExpression(0, sHeader, sIP()) > 0
		Debug sIP(0)
	Else
		MessageRequester("Error", "Es konnte keine IP gefunden werden.")
	EndIf
	
	FreeRegularExpression(0)
Else
	MessageRequester("Error", RegularExpressionError())
EndIf
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Das ging auch ohne externe Webseite.

Ich hatte mal einen Code gefunden, der die Mac Adresse ausliest. (PureArea oder hier im Forum... ihr wißt ja... das alter ;) )
Nach einer kleinen Modifikation ermittelt das Teil nun die eigene IP-Adresse.
(Also nicht die LAN IP)

Code: Alles auswählen

Structure IP_ADDR_STRING
 pNext.l
 IpAddress.b[16]
 IpMask.b[16] 
 Context.l
EndStructure

Structure IP_ADAPTER_INFO
 Next.l
 ComboIndex.l
 AdapterName.b[260] ; MAX_ADAPTER_NAME_LENGTH + 4
 Description.b[132] ; MAX_ADAPTER_DESCRIPTION_LENGTH + 4
 AdressLength.l
 Address.b[8] ; MAX_ADAPTER_ADDRESS_LENGTH
 Index.l
 Type.l
 DhcpEnabled.l
 CurrentIpAddressPTR.l
 IpAddressList.IP_ADDR_STRING
 GatewayList.IP_ADDR_STRING
 DhcpServer.IP_ADDR_STRING
 HaveWins.l
 PrimaryWinsServer.IP_ADDR_STRING
 SecondaryWinsServer.IP_ADDR_STRING
 LeaseObtained.l
 LeaseExpires.l
EndStructure

Procedure.s N_GetOwnIP()

  Protected length.l=0, *Buffer, adapters, x, i, byte.b
  Protected tempipinfo.IP_ADAPTER_INFO
  Protected Result = GetAdaptersInfo_(0,@length)
  Protected Adapter.s, Adresse.s, Mac.s = ""

  If Result=#ERROR_BUFFER_OVERFLOW
  
    *Buffer = AllocateMemory(length)
    Result  = GetAdaptersInfo_(*Buffer,@length)

    If Result=#ERROR_SUCCESS
    
      adapters=length/SizeOf(IP_ADAPTER_INFO)

      For x=0 To adapters-1

        tempipinfo.IP_ADAPTER_INFO

        For i=0 To SizeOf(IP_ADAPTER_INFO)-1
          byte.b=PeekB(*Buffer+(x*640)+i)
          PokeB(tempipinfo+i,byte)
        Next i

        Adapter.s = PeekS(@tempipinfo\Description)

        If Left(Adapter,4) = "WAN "
          Adresse.s = PeekS(@tempipinfo\IpAddressList+4)
        EndIf

        mac =""

        For i=0 To 5
          
          byte.b=PeekB(@tempipinfo\Address+i)
          If byte>=0
            mac+RSet(Hex(byte),2,"0")
          Else
            mac+RSet(Hex(byte+256),2,"0")
          EndIf

          If i<5
            mac+":"
          EndIf

        Next i

      Next x
      
    Else
      
      Debug "Error : "+Str(Result)
    
    EndIf

EndIf 

ProcedureReturn Adresse
EndProcedure

Debug N_GetOwnIP()
funktioniert unter 4.30, sollte aber eigentlich auch unter 4.1 funktionieren...
Mich wundert nur, dass keiner der "Profs" das erwähnte ....
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Angesehen davon, daß es nur einen Rückgabewert gibt, wenn die Bezeichnung des Netzwerkadapters mit "WAN " beginnt, bekomme ich nach Eleminierung dieser Prüfung trotzdem nur meine interne IP angezeigt. (Mein Adaptername beginnt übrigens mit "Intel (R)...")

Anm: Ich sitze gerade in einem Firmennetzwerk, bin also nicht direkt mit dem Internet verbunden.

Die Lösung über eine externe Webseite (s. 2 posts weiter oben) funktioniert aber auch im Firmennetzwerk tadellos.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Der Code gibt bei mir auch die IP im lokalen Subnetz zurück. Hätte mich auch gewundert wenn das so ginge.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Hm also bei mir wird die IP zurückgegeben, die ich auch über die Webadresse sehen kann.

Bei diversen anderen Rechnern, die mein Programm nutzen, wo ich das eingebaut habe, funktioniert es eigentlich so wie es soll...
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Kurzer hat geschrieben:Oder in kurz...
Das hier ist kurz! :mrgreen:
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Beitrag von Kurzer »

Schon klar, aber das geht nur so lange Dein php-Skript da liegt.
Anders gesagt: Bei den anderen Lösungen ist man flexibler (um nicht zu sagen "nicht von Dir abhängig" ;) )
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Antworten