![]() |
Eigene IP Adresse ermitteln
Hallo.
Ich dachte so etwas sollte eigentlich leicht in einem Forum zu finden sein, aber ich habe nichts gescheites gefunden. Einfache Aufgabe: IP Adresse in der eigenen Delphi Anwendung ermitteln. Ob Array von 4 Zahlen oder String ist egal. Möglichst kurz und einfach sollte es sein, damit man es verstehen kann. a) Generel: Wie kommt man an die eigene IP in einer Konsolen-Anwendung. b) Sockets: Also ich arbeite eigentlich mit TClientSocket/TServerSocket, die nicht auf der Form liegen. Wie kann man die IP mit Hilfe der Delphi Unit "ScktComp" ermitteln ? c) Welche anderen Formen gibt es die IP zu ermitteln (z.B. Indy etc.)? Folgendes bietet Java kurz und knackig an:
Delphi-Quellcode:
Warum auch nicht Delphi in vergleichbarer Form ?
String[] strings = InetAddress.getLocalHost().toString().split("/");
String myIP = strings[strings.length - 1]; ![]() MfG |
Re: Eigene IP Adresse ermitteln
HI,
kommt ganz darauf an, welche IP du haben willst. Die öffentliche IP (Internet) oder die private Adresse (lokales Netz). Die erstere bekommst du bei Seitenaufrufen auf Seiten, die dir deine IP verraten, letztere durch einen API-Aufruf. Für letztere hast du ja schon einen Weg gefunden. Ich kann dir nur einen sehr ähnlichen oder fast den selben anbieten. Die Seiten für die öffentliche IP bekommst du hier: ![]() Bernhard EDIT: Die angegebenen Links führten größtenteils zu 404-Seiten, also mal schnell: |
Re: Eigene IP Adresse ermitteln
Ich geh mal davon aus, es ist die Rede von der globalen IP Adresse, denn für die lokale gibts hier genug Sourcen.
Versuch mal whatismyipaddress.com in cmd anzupingen. Falls das funktioniert, schreibe dir die IP dieser Seite auf und mache folgendes: 1. telnet <ip> 80 2. Nach Verbindungsaufbau folgendes tippen:
Code:
Genau diesen Vorgang kannst du auch "automatisieren" / "programmieren".
GET / HTTP/1.1<enter>
Host: <IrgendEineIP><enter> <enter> <enter> Folgender Code dürfte solch eine Verbindung aufbauen, denn HTTP Request senden, Rückgabe-String parsen und dir deine globale IP Adresse als String zurückgeben.
Delphi-Quellcode:
MfG
uses WinSock2;
function GetWANIP(): String; // whatismyipaddress.com -- 140.239.191.10 var WSAD: TWSAData; Sock: TSocket; Addr: TSockAddrIn; Timo: Cardinal; GetMsg: String; Buffer: Array[0..$400-1] of Char; begin if WSAStartup( $202, WSAD ) = 0 then begin Sock := socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if Sock <> SOCKET_ERROR then begin Timo := $1000; setsockopt( Sock, SOL_SOCKET, SO_SNDTIMEO, pChar( @Timo ), SizeOf( Timo ) ); with Addr do begin sin_family := AF_INET; sin_port := htons( 80 ); sin_addr.S_addr := inet_addr( '140.239.191.10' ); end; if connect( Sock, @Addr, SizeOf( Addr ) ) = 0 then begin GetMsg := 'GET / HTTP/1.1'#13#10+ 'Host: 140.239.191.10'#13#10#13#10; Timo := Length( GetMsg ); if send( Sock, GetMsg[1], Timo, 0 ) = Timo then begin FillChar( Buffer[0], $400, 0 ); if recv( Sock, Buffer[0], $400, 0 ) > 0 then begin Result := Buffer; Timo := Pos( #13#10#13#10, Result ); if Timo > 0 then Result := Copy( Result, Timo+4, 15 ); end; end; end; closesocket( Sock ); end; WSACleanup(); end; end; |
Re: Eigene IP Adresse ermitteln
Hallo Cicaro.
Zitat:
Es gibt Hardware und Software Adaptoren (virtuelle Adaptoren). Virtuelle Adaptoren können mittels API in fast beliebiger Anzahl erstellt werden. Jeder Adapter erhält eine MAC-Adresse und IP. Also wenn Du die IP ermitteln möchtest, musst du wissen von welchem Adapter du diese auslesen willst. Beispiel Notebook: W-Lan, NIC, ISDN, ADSL, Firewalls, Virenscanner, BlueTooth usw. Hier kann es möglich sein, dass bis zu 7 IP's (Adaptoren) vorhanden sind. Also Kurz und einfach, ohne sich genauer mit der Materie zu beschäftigen, wirds nicht gehen! Wenn Du Komponenten wie "ScktComp" verwendest, wird immer die IP des an den Adapter gebundenen Sockets ausgegeben. Bei Verwendung von "komplizierter" Socket-API oder IPHelper-API ist es jederzeit möglich alle IP's korrekt zu ermitteln! Oder man verwendet die "kurz und knackige Java Funktion", und weiss anschliessend nicht was man eigentlich getan hat! Zitat:
http://msdn.microsoft.com/en-us/library/aa366073(VS.85).aspx http://msdn.microsoft.com/en-us/library/ms740506(VS.85).aspx lg. Astat |
Re: Eigene IP Adresse ermitteln
a) Man nutzt die gleichen Möglichkeiten, wie in einer Formularanwendung. --> Frage ist obsolet
b) In dieser Unit gibt es dafür keine Funktionen oder Methoden c) Mit Indy erstellst du dir ein Objekt von TidIPWatch und suchst dir die passende Methode. d) Weitere Möglichkeiten wurden genannt oder finden sich u.a hier in der CodeLib Edit: Hier sind zwei Lösungen. Aber sie geben nur eine der möglichen IP'n wieder (siehe Astat).
Delphi-Quellcode:
var myIP:string;
begin //Variante 1 (idIPWatch) with TidIPWatch.create(nil) do begin myIP:=LocalIP; free; end; memo1.lines.add(myIP); // Variante 2 (scktcomp) with TClientsocket.Create(nil) do begin myIP:=inttohex(Socket.LookupName('').S_addr,8); free; end; memo1.lines.add(myIP); |
Re: Eigene IP Adresse ermitteln
Zitat:
Cheers, |
Re: Eigene IP Adresse ermitteln
Zitat:
1. Braucht der Code zum ermitteln einer IP mittels TClientsocket noch kein Fenster. Das geht definitv in jeder Konsole 2. Was nützt es, wenn ich ein Programm habe, was nur die IP ausgibt. Wenn TClientsocket auch noch für andere Sachen verwendet wird, ist auch in einer Konsole alles vorhanden 3. Das Handle liefert die Komponente, man selber muss nur die Messages empfangen. |
Re: Eigene IP Adresse ermitteln
Zitat:
zu b) Komisch, deine Variante 2 ist genau das, was ich gesucht hab, und die Methode stammt aus dieser Unit. :thumb: Also so funktioniert es für mich am besten:
Delphi-Quellcode:
Und ich hab nach der privaten IP Adresse gesucht. Die öffentliche ist die des Modem/Routers und die kann/will ich nicht wirklich für meinen Server benutzen.
var
strIP: String; intIP: Integer; begin with TClientSocket.Create(nil) do // TServerSocket geht auch begin intIP := Socket.LookupName('').S_addr; strIP := IntToStr(Byte(intIP)) + '.' + IntToStr(Byte(intIP shr 8)) + '.' + IntToStr(Byte(intIP shr 16)) + '.' + IntToStr(Byte(intIP shr 24)); Free(); end; Caption := strIP; end; Also demnach ist a), b) und c) beantwortet. Danke sirius! |
AW: Eigene IP Adresse ermitteln
@Cicaro Sehr genial kurz und funktionell ! THX
Uses: ScktComp |
AW: Eigene IP Adresse ermitteln
Ich hatte einmal ein ähnliches Tool benötigt.
1. Lösung war eine einfache .bat Datei wo die IP in eine txt gespeichert wird. ip.bat
Code:
2. Tool war notwendig um die DynDNS bei auf eigene Strato Seiten zu aktualisieren.
@echo off & setlocal
REM set URL=http://checkip.dyndns.com/ set URL=http://meineip.softwareschuhmann.de echo externe IP-Adresse wird ber %URL% ermittelt echo und in die Datei IP.TXT gespeichert. set G=%temp%\GetHTML.vbs echo On Error Resume Next:Set Http=CreateObject("WinHttp.WinHttpRequest.5.1"):Http.Open "GET",WScript.Arguments(0),False:Http.Send:Q=Split(Http.ResponseText,":")(1):WScript.Echo Trim(Split(Q,"<")(0))>%G% set ExtIP= for /f %%i in ('cscript //nologo %G% "%URL%"') do set "ExtIP=%%i" del %G% if not defined ExtIP echo Externe IP konnte nicht ermittelt werden. & goto :eof set PFAD=%~dp0 set DATEI=IP.txt if exist %PFAD%%DATEI% del /Q %PFAD%%DATEI% if not exist %PFAD%%DATEI% echo %ExtIP% > %PFAD%%DATEI% echo ext. IP : %ExtIP%
Delphi-Quellcode:
vielleicht kann das jemand weiterverwenden.
unit Unit1;
interface uses Windows, Messages, winsock, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtrls, SHDocVw, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP; type TForm1 = class(TForm) btn1: TButton; Label1: TLabel; IdHTTP1: TIdHTTP; Label2: TLabel; IdHTTP2: TIdHTTP; Label3: TLabel; Label4: TLabel; Label5: TLabel; procedure btn1Click(Sender: TObject); procedure FormShow(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; IPADRESSE:String; const HOSTNAMEN='xxxx.xxxxxx.de'; USERNAME ='xxxxxxxxxx'; PASSWORT ='**********'; implementation {$R *.dfm} Function GeExtIP: string; var ndx: integer; begin //result:=uppercase(Form1.IdHTTP1.Get('http://checkip.dyndns.com')); result:=uppercase(Form1.IdHTTP1.Get('http://meineip.softwareschuhmann.de')); if result='' then result:='GET failed' else begin ndx:=pos(':',result); if ndx=0 then result:='host not found' else begin delete(result,1,ndx); delete(result,pos('<',result),Length(result)); result:=trim(result); end; end; end; Function UpdateIP: string; // für Strato begin Form1.IdHTTP2.Request.BasicAuthentication:=True; Form1.IdHTTP2.Request.Username:=USERNAME; Form1.IdHTTP2.Request.Password:=PASSWORT; result:=Form1.IdHTTP2.Get(Format('http://dyndns.strato.com' +'/nic/update?system=dyndns&hostname=%s&myip=%s' ,[HOSTNAMEN,IPADRESSE])); end; procedure TForm1.btn1Click(Sender: TObject); begin IPADRESSE:=GeExtIP; label1.Caption:= IPADRESSE; Label2.Caption:=UpdateIP; end; procedure TForm1.FormShow(Sender: TObject); begin Label5.Caption:= HOSTNAMEN; btn1click(self); end; end. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:56 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-2025 by Thomas Breitkreuz