![]() |
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:
und dieser gibt mir immer nur meine LAN Ip. (Ich bin über W-lan verbunden!)
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; 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 |
Re: WAN IP via Winsock-API und dann Flaggen zuweisen
Zitat:
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 ![]() 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. |
Re: WAN IP via Winsock-API und dann Flaggen zuweisen
Zitat:
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 |
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:
Inkompatible Typen: Char und AnsiChar?
phe := GetHostByName(Pchar(HostName));
Naja, jedenfalls schonmal Thx^^ |
Re: WAN IP via Winsock-API und dann Flaggen zuweisen
Unicode Problem. Schreib mal explizit PAnsiChar.
|
Re: WAN IP via Winsock-API und dann Flaggen zuweisen
was meinst du mit explizit? thx
|
Re: WAN IP via Winsock-API und dann Flaggen zuweisen
Unter Delphi < 2010 war PChar = PAnsiChar und Delphi 2010 ist PChar = PWideChar.
|
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 |
Re: WAN IP via Winsock-API und dann Flaggen zuweisen
Zitat:
lg. Astat |
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 22:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz