Una manera efectiva de lograrlo es haciendo una peticion http a un servidor de esos que proveen informacion acerca del ip con el que te conectas a Internet (la ip del router), tomar lo que te devuelve y determinar el ip.
Ese servicio esta dado por los proveedores de dns dinamicos, ya que existen clientes que instalas en tu maquina y determinan el ip con el que te conectas a Internet para poder actualizar los servidores de dns dinamicos "transparentemente"
Una de esas paginas es
http://dynamic.zoneedit.com/checkip.html
Algo de codigo:
Para hacer la peticion http, ClientSocket con las propiedades:
- Host: zoneedit.com
- Puerto: 80
- Active : true
Código:
with ClientSocket do begin
Socket.SendText('GET http://dynamic.zoneedit.com/checkip.html HTTP/1.0'+#13#10);
Socket.sendText('Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-excel, */*'+#13#10);
Socket.SendText('Referer: http://www.zoneedit.com/'+#13#10);
Socket.sendText('User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'+#13#10);
Socket.SendText('Host: www.zoneedit.com'+#13#10);
Socket.sendText('Content-Length: 0'+#13#10);
Socket.sendText(''+#13#10);
Socket.sendText(''+#13#10);
end;
Cuando reciba la respuesta del servidor, parseamos la respuesta para tomar el IP (en un string):
Código:
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
str : string;
posIp : integer;
posFin : integer;
ip : string;
begin
str := cs.Socket.ReceiveText;
posIp := pos('Current IP Address:', str);
posFin := pos('<br>Hostname', str);
ip := copy(str, posIp + 20, posFin - (posIp + 22));
end;