Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi WAN IP via Winsock-API und dann Flaggen zuweisen (https://www.delphipraxis.net/145918-wan-ip-via-winsock-api-und-dann-flaggen-zuweisen.html)

DarkItachi 10. Jan 2010 22:47


WAN IP via Winsock-API und dann Flaggen zuweisen
 
Hallöchen!

Ich (ver)suche schon wieder mal seit Stunden einen Code und finde keinen -.-
Ich will die Wan IP mittels WinSock-API (!) ermitteln!
Ich will dazu keine extra Komponente benutzen und auch nicht auf eine Website zugreifen!

Ich finde immer diesen Code:
Delphi-Quellcode:
Function GetIPAddress():String;
type
  pu_long = ^u_long;
var
  varTWSAData : TWSAData;
  varPHostEnt : PHostEnt;
  varTInAddr : TInAddr;
  namebuf : Array[0..255] of char;
begin
  If WSAStartup($101,varTWSAData) <> 0 Then
  Result := 'No. IP Address'
  Else Begin
    gethostname(@namebuf[0],length(namebuf));
    varPHostEnt := gethostbyname(@namebuf[0]);
    varTInAddr.S_addr := u_long(pu_long(varPHostEnt^.h_addr_list^)^);
    Result := 'IP Address: '+inet_ntoa(varTInAddr);
  End;
  WSACleanup;
end;
und dieser gibt mir immer nur meine LAN Ip. (Ich bin über W-lan verbunden!)
Aufjedenfall ist es wichtig, dass diese Funktion das schnell prüft... eigentlich so wie Ipconfig.

Hat jemand eine Idee?



Danke im vorhinein!
Hoffentlich ist jemand so erfahren und kann mein Problem lösen.. Oder mir einen Tip geben! ^^

MfG

sx2008 11. Jan 2010 07:57

Re: WAN IP via Winsock-API und dann Flaggen zuweisen
 
Zitat:

Zitat von DarkItachi
Ich will die Wan IP mittels WinSock-API (!) ermitteln!
Ich will dazu keine extra Komponente benutzen und auch nicht auf eine Website zugreifen!

und dieser gibt mir immer nur meine LAN Ip. (Ich bin über W-lan verbunden!)
Aufjedenfall ist es wichtig, dass diese Funktion das schnell prüft... eigentlich so wie Ipconfig.

Ein Tipp:
wenn du etwas erreichen möchtest, dann schränke dich nicht vorher ein durch Bedingungen, die nur wenig Sinn machen
wie z.B. "es muss unbedingt die WinSock-API sein".
Geschwindigkeit ist ebenfalls kein Hauptziel, den so oft kann sich die externe IP ja nicht ändern.

Nun zu den Grundlagen:
Der Einzige, der deine externe IP kennt ist dein Router und dein Internet Service Provider.
Du kannst deinen Router direkt fragen und dazu UPnP verwenden oder du sendest einen HTTP-Request
an bestimmte Website(s) und die sagen dir deine IP.

Die Verwendung einer Website ist recht einfach, hat aber den Nachteil, dass du auf eine fremde Website angewiesen bist.
Die Abfrage über UPnP ist programmiertechnisch einiges anspruchsvoller, hat aber den Vorteil, dass die du die externe IP aus erster Hand bekommst.
Allerdings könnte UPnP im Router auch abgeschaltet sein.

Astat 11. Jan 2010 08:31

Re: WAN IP via Winsock-API und dann Flaggen zuweisen
 
Zitat:

Zitat von DarkItachi
..und dieser gibt mir immer nur meine LAN Ip. (Ich bin über W-lan verbunden!)
Aufjedenfall ist es wichtig, dass diese Funktion das schnell prüft... eigentlich so wie Ipconfig.
Hat jemand eine Idee?

Hallo DarkItachi, Du liest nur zufällig eine Adapter IP aus der Liste, du musst alle lesen.

Delphi-Quellcode:

function IPListFromHost(const HostName: string): string;
type
  TaPInAddr = array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  i: Integer;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  Result := '';
  phe := GetHostByName(PChar(HostName));
  if phe <> nil then begin
    pPtr := PaPInAddr(phe^.h_addr_list);
    i := 0;
    while pPtr^[i] <> nil do begin
      Result := Result + inet_ntoa(pptr^[i]^) + #13#10;
      Inc(i);
    end;
  end;
  WSACleanup;
end;

lg. Astat

DarkItachi 11. Jan 2010 19:22

Re: WAN IP via Winsock-API und dann Flaggen zuweisen
 
Ok... Das ich unbedingt eine schnelle Methode haben will, hängt davon ab, dass ich meine Programme so schnell wie möglich haben möchte! Egal bei was... Und Komponente benutze ich sehr ungern weil die öfters (bei falschen Einsatz) das ganze Tool unstabil machen!
Meine Applikationen sollen so schnell und stabil wie möglich (soweit ich das kann) sein!
Es soll immer wenig umständlich sein usw.

Naja Ok, Warum zeigt mein Compiler immer an, dass ich einen Fehler darin habe?
Delphi-Quellcode:
phe := GetHostByName(Pchar(HostName));
Inkompatible Typen: Char und AnsiChar?

Naja, jedenfalls schonmal Thx^^

Luckie 11. Jan 2010 20:13

Re: WAN IP via Winsock-API und dann Flaggen zuweisen
 
Unicode Problem. Schreib mal explizit PAnsiChar.

DarkItachi 11. Jan 2010 20:23

Re: WAN IP via Winsock-API und dann Flaggen zuweisen
 
was meinst du mit explizit? thx

Luckie 11. Jan 2010 20:28

Re: WAN IP via Winsock-API und dann Flaggen zuweisen
 
Unter Delphi < 2010 war PChar = PAnsiChar und Delphi 2010 ist PChar = PWideChar.

DarkItachi 11. Jan 2010 20:33

Re: WAN IP via Winsock-API und dann Flaggen zuweisen
 
ok habe ich gemacht...
Wenn ich die Funktion jetzt aber in z.B showmessage benutze, dann bekomme ich diese Meldungen:
[DCC Fehler] uMainForm.pas(136): E2035 Nicht genügend wirkliche Parameter (bei showmessage)

und bei
Delphi-Quellcode:
phe := GetHostByName(PAnsiChar(HostName));
:

[DCC Warnung] uMainForm.pas(323): W1044 Bedenkliche Typumwandlung von string in PAnsiChar

Astat 11. Jan 2010 21:47

Re: WAN IP via Winsock-API und dann Flaggen zuweisen
 
Zitat:

Zitat von DarkItachi
[DCC Warnung] uMainForm.pas(323): W1044 Bedenkliche Typumwandlung von string in PAnsiChar

Hallo DarkItachi, ja, D2009 - D2010, ignoriers!

lg. Astat

sx2008 12. Jan 2010 05:22

Re: WAN IP via Winsock-API und dann Flaggen zuweisen
 
GetHostByName() führt eine Namensauflösung über DNS oder NetBios aus.
Auf diesem Wege kommt man aber nicht an die externe IP.
(es sei denn, der Rechner wäre bei dynip.com oder vergleichbaren Diensten registriert)


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz