Niby dwa różne IP zewnętrzne - pobieranie

0

Cześć

Chciałem pobierać programowo swoje IP zewnętrzne. (Jestem w sieci LAN)
Wykorzystałem do tego pobranie kodu strony (np. strona http://www.whatismyip.com/) i wyciągnięcie z niej IP - jest Ok.
Jestem widoczny w internecie, ale pod adresem 83.17.13.10 (IP przydzielone mojemu dostawcy) Ktoś powie "ok to jest Twoje IP zewnętrzne" - ale
wchodząc na czat polchatu jako admin - widzę że jestem pod adresem 195.205.2.13 (to jest adres z puli adresów mojego dostawcy).
Myślę że na wielu serwerach, a na pewno w moich wyślanych mailach jest taki adres. I dobrze.. bo właśnie chodzi o właściwy adres by zniego zidentyfikować użytkownika.
Ale jest problem - Jak pobrać, za pomocą czego i jakim sposobem ten właściwy IP ? Do jakich żródeł zajrzeć itd..?

0

sprawdz jakie w kompie masz IP, start -> uruchom -> cmd -> ipconfig. Jesli bedzie to te wlasciwe to jest taki komponent IPWatch w zakladce Indy Misc, obsluga banalna, pozdrawiam

0
function TForm1.LocalIP: string;
type
   TaPInAddr = array [0..10] of PInAddr;
   PaPInAddr = ^TaPInAddr;
var
    phe: PHostEnt;
    pptr: PaPInAddr;
    Buffer: array [0..63] of char;
    i: Integer;
    GInitData: TWSADATA;
begin
    WSAStartup($101, GInitData);
    Result := '';
    GetHostName(Buffer, SizeOf(Buffer));
    phe :=GetHostByName(buffer);
    if phe = nil then Exit;
    pptr := PaPInAddr(Phe^.h_addr_list);
    i := 0;
    while pptr^[i] <> nil do
    begin
      result:=StrPas(inet_ntoa(pptr^[i]^));
      Inc(i);
    end;
    WSACleanup;
end;

A NASTĘPNYM RAZEM <font size="3">POSZUKAJ</span>!!

0

Dzięki :) ale chyba się nie zrozumieliśmy :P

Ty mówisz o IP lokalnym np. 10.9.0.1 (takie pobiera IdIPWatch..jak i zresztą wiele kodów w Delphi)
A mnie chodzi o IP zewnętrzne (dla przypomnienia - jestem w sieci LAN)
Jak pobrać IP zewnętrzne - też wiem .. bo wczytuję komponentem THTTPget kod jakiejś stronki podającej IP zewnętrzne, i wydłubuje sam adres IP z tekstu.
Ale problem polega na tym że są przypadki kiedy w sieci pojawiam się na dwu różnych IP zewnętrznych.
Chodzi o co ? na stronach podających IP zewnętrzne widnieje przykładowo pod
adressem IP:
83.17.13.10 - pobierając DNS wychodzi: akj10.internetdsl.tpnet.pl
A mój dostawca ma przykładowo:
195.200.10.40 - pobierając DNS wychodzi admin.londoncomputer.co.uk

W tym ostatnim przypadku się zgadza, bo własnie jestem userem takiej sieci "londoncomputer"
Więc praktycznie dostęp do sieci wygląda tak:
moje lokalne IP 10.9.0.1 -----> IP dostawcy 195.200.10.40 -----> IP tepsy która dostarcza neta mojemu dostawcy 83.17.13.10
i właśnie na tym ostatnim IP , ja loguje się na stronach WWW
Ale są przypadki (np czaty) gdzie widoczny jestem pod IP mojego dostawcy.
I o te IP mi chodzi - jak je pobrać ?

Jakie mam IP to ja wiem :) Tylko że robię programik który pokazuje wszystkie parametry połączenia (maska, bramka , serwery DNS, DHCP itd..)
No i ktoś mający mój program powie że dałem plame jeśli wyświetli mu się IP tepsy , a wejdzie na jakąś inną stronkę i luknie IP dostawcy.
Więc w takich przypadkach chcę podawać dwa adresy IP :P

0

Skoro piszesz, ze masz dwa ip zewnetrzne no to znajdz dwie stronki z ktorych jedna wczytuje pierwsze, a druga drugie ip :) Heh, nie chce mi sie juz myslec, oka schodze z pokladu, pozdrawiam

0

W tym sęk że siedzę całą noc i szukam takich stronek :D
Mam ich całą tonęl :D i domyślam się że będzie więcej.
Ale każda z nich pokazuje te ostatnie IP. Jedynie gdy wchodze na czat polchatu jako admin i luknę na mojego ipka, to podaje IP te właściwe z mojej miejscowości, czyli IP z puli mojego dostawcy. A jakim sposobem czaty pobierają takie właśnie IP ? to nie wiem :( I o to właśnie pytam. Bym mógł w swoim programiku wyświetlać takie IP prawidłowe - czyli identyfikujące usera, skąd gość jest i z jakiej sieci IP :P A nie jakiejś tam tepsy.

0

Nie dawno miałem ten sam problem, ktoś mi podowiedział aby pobrać zewnętrzy IP z jakiejś strony. Niestety strona którą mi podał pokazywała <ort>nie prawidłowe</ort> IP, wtedy postanowiłem sprawdzić komendą tracert co za IP mi ta strona pokazuje. I wtedy własnie wpadłem na pomysł żeby sobie zrobić coś takiego jak Tracert tylko przerywać na pierwszym IP, które nie ort! do puli wewnętrznych adresów IP. Trochę pogrzebalam i na jakiejś Rosyjskiej stronie znalazłem kodzik jakiegoś tracerta. Po przeróbkach (jeszcze nie zoptymalizowany i nie przerobiony na funkcję) wygląda to tak:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, WinSock;

const
  ICMP = 'ICMP.DLL';
    
type
  IP_INFO = packed record
    Ttl: Byte;
    Tos: Byte;
    IPFlags: Byte;
    OptSize: Byte;
    Options: Pointer;
  end;
  PIP_INFO = ^IP_INFO;
  
  ICMP_ECHO = packed record
    Source: Longint;
    Status: Longint;
    RTTime: Longint;
    DataSize: Word;
    Reserved: Word;
    pData: Pointer;
    i_ipinfo: IP_INFO;
  end;

  TForm1 = class(TForm)
    Label1: TLabel;
    lblLocalIP: TLabel;
    lblIP: TLabel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
     TraceHandle: THandle;
    DestAddr: in_addr;
    function GetDottetIP(const IP: Longint): String;
    function Trace(const Iteration: Byte): Integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  function IcmpCreateFile: THandle; stdcall; external ICMP name 'IcmpCreateFile';
  function IcmpCloseHandle(IcmpHandle: THandle): BOOL; stdcall;
    external ICMP name 'IcmpCloseHandle';
  function IcmpSendEcho(IcmpHandle : THandle; DestAddress: Longint;
    RequestData: Pointer; RequestSize: Word; RequestOptns: PIP_INFO;
    ReplyBuffer: Pointer; ReplySize, Timeout: DWORD): DWORD; stdcall;
    external ICMP name 'IcmpSendEcho';

implementation

{$R *.dfm}

function TForm1.GetDottetIP(const IP: Longint): String;
begin
  Result := Format('%d.%d.%d.%d', [IP and $FF,
    (IP shr 8) and $FF, (IP shr 16) and $FF, (IP shr 24) and $FF]);
end;

function TForm1.Trace(const Iteration: Byte): Integer;
var
  IP: IP_INFO;
  ECHO: ^ICMP_ECHO;
  Error: Integer;
begin
  GetMem(ECHO, SizeOf(ICMP_ECHO));
  try
    with IP do
    begin
      Ttl := Iteration;
      Tos := 0;
      IPFlags := 0;
      OptSize := 0;
      Options := nil;
    end;

    Error := IcmpSendEcho(TraceHandle,
                          DestAddr.S_addr,
                          nil,
                          0,
                          @IP,
                          ECHO,
                          SizeOf(ICMP_ECHO),
                          5000);

    if Error = 0 then
    begin
      Result := -1;
      Exit;
    end;

    Result := ECHO.Source;

  finally
    FreeMem(ECHO);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
const
  DEST_ADDR = 'www.google.pl';
  IterationCount = 30;
  //tu dodaj także inne adresy wew. IP
  LocalIP: array[0..1] of string = ('127.', '192.168.');
var
  WSData: TWSAData;
  host: PHostEnt;
  Res, Iteration: integer;
  i: integer;
  buffor: array [0..255] of char;
begin
  WSAStartup($101, WSData);

  GetHostName(buffor, Length(buffor));
  host:= GetHostByName(buffor);
  CopyMemory(@buffor[0], iNet_ntoa(PInAddr(host^.h_addr_list^)^), Length(buffor));
  lblLocalIP.Caption:= buffor; //Wewnetrzne IP

  host:= GetHostByName(DEST_ADDR);
  DestAddr:= PInAddr(host^.h_addr_list^)^;

  Res:= 0;
  Iteration:= 0;
  TraceHandle := IcmpCreateFile;
  if TraceHandle <> INVALID_HANDLE_VALUE then
  begin
    while (Res <> DestAddr.S_addr) and
            (Iteration < IterationCount) do
    begin
      Inc(Iteration);
      Res:= Trace(Iteration);
      if Res <> - 1 then
      begin
        CopyMemory(@buffor[0], @GetDottetIP(Res)[1], Length(buffor));

        i:=Low(LocalIP);
        while i <= High(LocalIP) do
        begin
          if LocalIP[i] = Copy(buffor, 1, Length(LocalIP[i])) then
             break;
          Inc(i)
        end;
        
        if i > High(LocalIP) then
          Iteration:= IterationCount;
      end;
    end;
    IcmpCloseHandle(TraceHandle);
  end;
  lblIP.Caption:= buffor; //Zewnetrzne IP
  WSACleanUp;
end;

end.

Poddałem sposób aby użyć Tracerta, gdyby jednak znalazł inny sposób (krótszy) proszę aby podzielił się kodem.
EDIT//Nie sprawdzałem tego też na innych systemach niż Win98, oczywiście trzeba dodać też inne początki wewnętrzych adresów IP. Gdyby ktos miał pod ręką listę zakresów wew. adresów IP też proszę i podanie.

0

Wielkie dzięki kAzek [browar] :)
Naprowadziłeś mnie na dobry kierunek - a kodzik jest super.
Kodzik dobrze działa (porównywałem dokładność z innymi programami typu TraceOute) i pokazują to samo.
Ale jest jeszcze jeden <ort>szkopół </ort>:-/ i czegoś nie <ort>rozumiem </ort>[???]
We wszystkich programikach tego typu pokazuje mi się adres IP początkowy z puli mojego dostawcy - np. 195.200.10.10 (przykładowa pula: 195.200.10.10 do 195.200.10.50
A ja jak mówiłem poprzednio że chodzi mi o wydobycie tego mojego np: 195.200.10.40
I to dziwne ślędząc drogę pakietów nigdzie on nie występuje :|
A na czat Polchatu mam takiego ipka - czyli właściwego którego widać w kodzie maili itp.

//PS. pod XP też działa

0

Trochę zaadoptowałem powyższy kod dla swoich potrzeb.
Jest oky - nie potrzeba podawać zakresów wew. adresów IP
Automatycznie pobiera zakres w zależności od IP lokalnego usera.
Prosiłbym kolegów o sprawdzenie czy prawidłowo podaje zewnętrzne IP ?
U mnie działa, ale nie wiem jak u innych, bo są rózne topografie sieci.


UNIT modIPdostawca;
INTERFACE
Uses
 WinSock,Windows, Classes,SysUtils;

Type
 IP_INFO = Packed record
   TTL      :Byte;
   Tos      :Byte;
   IPflags  :Byte;
   OptSize  :Byte;
   Options  :Pointer;
 end;
 pIP_INFO = ^IP_INFO;

 ICMP_ECHO = Packed record
   Source   :Longint;
   Status   :Longint;
   RTtime   :Longint;
   DataSize :Word;
   Reserved :Word;
   pData    :Pointer;
   i_ipinfo :IP_INFO;
 end;

 FUNCTION GetLokalneIP:String;
 FUNCTION IPdostawcy(Adres:String):String;


IMPLEMENTATION
Uses
 {unit programu
 tymczasowo zadeklarowany by podejrzeć działanie w Memo1}
 Unit1;

 Function IcmpCreateFile: THandle; stdcall; external 'ICMP.DLL' name 'IcmpCreateFile';
 Function IcmpCloseHandle(IcmpHandle: THandle): BOOL; stdcall; external 'ICMP.DLL' name 'IcmpCloseHandle';
 Function IcmpSendEcho(IcmpHandle : THandle; DestAddress: Longint; RequestData: Pointer; RequestSize: Word; RequestOptns: pIP_INFO; ReplyBuffer: Pointer; ReplySize, Timeout: DWORD): DWORD;
          stdcall; external 'ICMP.DLL' name 'IcmpSendEcho';
Var
 TraceHandle :THandle;
 DestAddr    :in_addr;

{Fukcja pobiera lokalny adres IP}
FUNCTION GetLokalneIP:String;
var
 WSAData :TWSAData;
 buffor  :array [0..255] of char;
 hostEnt :PHostEnt;
Begin
 Result:= '';
 if WSAStartup($0101, WSAData) = 0 then
 try
   GetHostName(buffor,Length(buffor));
   hostEnt:= GetHostByName(buffor);
   CopyMemory(@buffor[0], Inet_ntoa(PInAddr(hostEnt^.h_addr_list^)^),Length(buffor));
   Result:= buffor;
 finally
   WSACleanup;
 end;
End; //ok. Win 98/XP

{ Obcina końcówkę lokalnego IP }
Function Obetnij(IP :String):String;
var
 lista :TStringList;
Begin
 lista:= TStringList.Create;
 try
   //dzielenie IP wg znaku dzielącego "." dla IP będą to 4 części
   ExtractStrings(['.'], [],PChar(IP),lista);
   //wyswietlenie ze zmiennej List - zdania numer 3
   Result:= lista[0]+'.' + lista[1]+'.';
 except
   Result:= '';  
 end;
 lista.Free;
End; //ok. Win 98/XP

{ Formatuje dane }
FUNCTION GetDottetIP(const IP:Longint):String;
Begin
 Result:= Format('%d.%d.%d.%d',[IP and $FF,(IP shr 8)
                                   and $FF,(IP shr 16)
                                   and $FF, (IP shr 24)
                                   and $FF]);
End; //ok. Win 98/XP

{ Wysyła echo }
FUNCTION TraceOute(const Iteration:Byte):Integer;
var
 IP    :IP_INFO;
 ECHO  :^ICMP_ECHO;
 Error :Integer;
Begin
 GetMem(ECHO,SizeOf(ICMP_ECHO));
 try
   with IP do
   begin
     TTL:= Iteration;
     Tos := 0;
     IPflags:= 0;
     OptSize:= 0;
     Options:= nil;
   end;
   Error:= IcmpSendEcho(TraceHandle, DestAddr.S_addr,nil,0,@IP,ECHO,SizeOf(ICMP_ECHO),5000);
   if Error = 0 then
   begin
     Result:= -1;
     Exit;
   end;
   Result:= ECHO.Source;
 finally
   FreeMem(ECHO);
 end;
End; //ok. Win 98/XP

{Funkcja śledzi trasę pakietów na podany adres
i wydobywa z niej IP dostawcy mające być IP zewnętrznym usera.
Pobiera kolejne IP występujące po drodze pakietu,
zatrzymując się na pierwszym IP podanym w zakresie,
np: gdy napotkał '192.168.'}
FUNCTION IPdostawcy(Adres:String):String;
const
 IterationCount = 30;
var
 WSAData  :TWSAData;
 buffor   :array [0..255] of char;
 hostEnt  :PHostEnt;
 i,lp,Res :Integer;
 LocalIP  :array[0..1] of string;
Begin
 Result:= '';
 LocalIP[0]:= '127.';
 LocalIP[1]:= Obetnij(GetLokalneIP);
 Form1.Memo1.Clear;  //dodane tymczasowo by podejrzeć w Memo
 try
  if WSAStartup($101, WSAData) <> 0 then Result:= 'WinSock Error'
  else
  begin
    hostEnt:= GetHostByName( PChar(Adres) );
    DestAddr:= PInAddr(hostEnt^.h_addr_list^)^;
    Res:= 0;
    lp:= 0;
    TraceHandle:= IcmpCreateFile;
    if TraceHandle <> INVALID_HANDLE_VALUE then
    begin
      while (Res <> DestAddr.S_addr) and (lp < IterationCount) do
      begin
        Inc(lp);
        Res:= TraceOute(lp);
        if (Res <> - 1) then
        begin
          CopyMemory(@buffor[0], @GetDottetIP(Res)[1], Length(buffor));
          i:= Low(LocalIP);
          Form1.Memo1.Lines.Add(IntToStr(lp) +') '+ buffor); //podgląd w memo
          while i <= High(LocalIP) do
          begin
            Copy(buffor, 1, Length(LocalIP[i]));
            if LocalIP[i] = Copy(buffor, 1, Length(LocalIP[i])) then Break;
            Inc(i);
          end;
          if i > High(LocalIP) then lp:= IterationCount;
        end else
        {wyjście w przypadku gdy "zgubi" jeden adres IP
         - ponieważ tym zgubionym może być IP zewnętrzne,
         a wtedy będzie nadal pobierał IP z trasy pakietów, oraz podstawi
         ostatnie IP z trasy pakietów}
        begin
          buffor:= 'Błąd pobrania';
          Form1.Memo1.Lines.Add(buffor);  //podgląd w memo
          Break;
        end;
      end;
      IcmpCloseHandle(TraceHandle);
    end;
    Result:= buffor;
    WSACleanup;
  end
 except
   Result:= 'Błąd połączenia !';
 end;
End;  //ok. Win 98/XP
{*****************************}
END.


Zastosowanie:

procedure TForm1.Button1Click(Sender: TObject);
Begin
 Button1.Enabled:= False;
 Label1.Caption:= 'IP lokalne: ' + GetLokalneIP;
 Label2.Caption:= 'IP zewnętrzne: ' + IPdostawcy('www.google.pl');
 beep;
 Button1.Enabled:= True;
End;

PS. z kodu modułu można usunąć linię dotyczącą Memo1 - dałem ją dla sprawdzenia

Mimo wszystko problem załatwiony po częśći :-/
Uzyskuje tylko początkowy adres z puli dostawcy, a nie mój zewnętrzny jaki widoczny jest przykładowo w mailach

0

U mnie działa :) Tylko nie wiem co by było gdyby:
a) ktos miał zewnętrzne IP
b) miał rodzielone lokalne łącze.

Mój kumpel ma (przez proxy) w ten sposób:

[IP Zewnetrzne] [IP Lokalne z puli np. 10.80.x.x]

Dostawca ---------> Klient 1 komp. --------------------------> Klient 2 komp.

[IP Lokalne 10.80.x.x] [IP Lokalne 192.168.1.1] [192.168.1.2]

Jak będe u niego to sprawdzę co bedzie jeżeli uruchomi się program na 2 kompie.

0

Pojawia się 'błąd pobrania'

jestem za routerem 10.0.0.x z neo

PS. ja kiedys zadalem podobne pytanie na forum i jesli mam byc szczery nie otrzymalem (poszukujac rowniez samemu) do dzis sensownego rozwiazania.

PSii jesli usunie sie break'a to dostaje sie adres ip googli

0

Witam! Jestem tu nowy. Poszukuje skryptu, który wpisywalby do memo adresy IP komputerów w sieci lokalnej. Jest tym większy problem że adresy przydzielane są automatycznie przez system. Skrypt musiałby znaleŹć adresy IP i wpisać je w memo.

1 użytkowników online, w tym zalogowanych: 0, gości: 1