2011-08-10 15 views
10

Potrzebuję uzyskać mój zewnętrzny (publiczny) adres IP z Delphi.Jak uzyskać zewnętrzny (publiczny) adres IP w Delphi

To samo IP, które pokazuje na przykład www.whatismyip.com.

Jak mogę to zrobić? Winsock na to nie pozwala.

+0

przez zewnętrzny adres IP, to znaczy dostępną internetowy adres IP? Czy masz na myśli lokalny adres sieciowy, który nie jest 127.0.0.1? – Tremmors

+0

Adres internetowy, taki sam, który jest widoczny na stronie www.whatismyip.com – chubbyk

+0

To pytanie pokazuje rzeczywiste adresy IP komputera; http://stackoverflow.com/questions/576538/delphi-how-to-get-all-local-ips –

Odpowiedz

7

Nie sądzę, że możesz. Cóż, możesz zadzwonić do jakiejś usługi, która powie ci, jaki jest twój adres IP (np. http://www.whatismyip.com/) i dowiedzieć się o tym z odpowiedzi. Ale nie sądzę, aby cokolwiek na twoim komputerze było w stanie powiedzieć ci, jaki jest twój adres IP, do świata zewnętrznego.

Nietestowane, ale myślę, że można to zrobić z Indy:

MyPublicIP := IdHTTP1.Get('http://automation.whatismyip.com/n09230945.asp'); 

Proszę przeglądu zasad/polityki na stronie: http://www.whatismyip.com/faq/automation.asp przed użyciem tego produktu.

+12

... Powodem jest to, że twój adres publiczny niekoniecznie jest dołączony do twojego komputera. Całkiem często jest przypisany do zewnętrznego routera, który jest zupełnie innym komputerem niż wszystkie efekty. –

+0

Tak. Publiczny adres IP i adapter z domyślną bramą to dwie różne rzeczy. –

1

z pamięci, niesprawdzone:

function GetMyHostAddress: string; 
var 
    http: IWinHttpRequest; 
begin 
    http := CreateOleObject('WinHttp.WinHttpRequest5.1') as IWinHttpRequest; 
    http.Open('GET', 'http://automation.whatismyip.com/n09230945.asp', False); 
    http.Send(EmptyParam); 

    if http.StatusCode = 200 then 
     Result := http.ResponseText 
    else 
     Result := ''; 
end; 
6

Można korzystać z tej strony: http://ipinfo.io/json. Zwraca informacje o bieżącym połączeniu internetowym w formacie JSON.

W delphi musisz użyć IdHTTP w ten sposób: IdHTTP1.Get('http://ipinfo.io/json') i to zwróci ciąg znaków zawierający wszystkie dane. Można użyć JSON tłumacza chcesz lub można użyć lkJSON jak w poniższym przykładzie:

json := TlkJSON.ParseText(MainEstrutura.IdHTTP1.Get('http://ipinfo.io/json')) as TlkJSONobject; 

str := json.Field['ip'].Value; 

mam nadzieję pomóc.

+4

Jeśli zamiast tego użyjesz 'http: // ipinfo.io/ip ', zwróci on tylko adres IP w postaci zwykłego tekstu bez zawijania go w JSON, który musi zostać przeanalizowany. –

+0

Jako kod w tej odpowiedzi musisz użyć: 'http: // ipinfo.io/json', aby uzyskać wszystkie informacje na temat tego IP –

+2

OP nie poprosił o wyszukanie wszystkich szczegółów dotyczących adresu IP, tylko by pobrać sam adres IP . Więc '/ json' jest przesadą, gdy wystarczy'/ip'. Jeśli przeczytasz dokumentację witryny, poszczególne pola mogą zostać odzyskane samodzielnie. –

1

działa to dla mnie:

uses JSON,IdHTTP; 
    function GetIP():String; 
    var LJsonObj : TJSONObject; 
    str:string; 
    http : TIdHttp; 
    begin 
    str:=''; 
    http:=TIdHTTP.Create(nil); 
    try 
     str:=http.Get('http://ipinfo.io/json'); 
     LJsonObj:= TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(str),0)   as TJSONObject; 
     str := LJsonObj.Get('ip').JsonValue.Value; 
     LJsonObj.Free; 
     http.Free; 
    Except 
    end; 
    result:=str; 
end; 
+2

Wolę korzystać z usług, które same zgłaszają IP jako zwykły tekst bez dodatkowego formatowania metadanych. Na przykład: 'function GetIP: String; zacznij od TIdHTTP.Create wypróbuj Wynik: = http.Get ("http://ipinfo.io/ip"); wreszcie Wolny; koniec; koniec; ' –

-1
Function GetMyIP:string; 
var 
    xmlhttp:olevariant; 
    s,p:integer; 
    temp:string; 
begin 
    result:=emptystr; 
    xmlhttp:=CreateOleObject('Microsoft.XMLHTTP'); 
    try 
    xmlhttp.open('GET', 'http://www.findipinfo.com/', false); 
    xmlhttp.SetRequestHeader('User-Agent','Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3'); 
    xmlhttp.send(null); 
    except 
    exit; 
    end; 
    if(xmlhttp.status = 200) then 
    temp:=trim(VarToStr(xmlhttp.responseText)); 
    xmlhttp:=Unassigned; 
    s:=pos('Address Is:',temp); 
    if s>0 then 
    inc(s,11) 
    else 
    exit; 
    temp:=copy(temp,s,30); 
    s:=pos('<',temp); 
    if s=0 then exit 
    else 
    dec(s); 
    result:=trim(copy(temp,1,s)); 
end; 
Powiązane problemy