El código se divide en dos partes, una en delphi y otra en php.
La parte de php es esta (el archivo lo llamo agent.php):
<?php Main(); ?> <?php function remoteip() { $ip = 0; $ip = $_SERVER["HTTP_CLIENT_IP"]; { if ($ip) { $ip = 0; } foreach($iplist as $v) return $v; } return ($ip) ? $ip : $_SERVER["REMOTE_ADDR"]; } function testport($port, $timeout = 30) { $host = remoteip(); if($fp) { echo 'open'; } else { echo 'close'; } } function updateip() { $host = remoteip(); if ($con) { $sql="INSERT INTO iplist (uid, ip, fecha) VALUES ($_GET[uid],'$host',NOW())"; { { $sql="UPDATE iplist SET ip='$host',fecha=NOW() WHERE uid=$_GET[uid]"; { echo 'OK'; } } } else { echo 'OK'; } } } function Main() { $myself = $_SERVER['PHPSELF']; { $cmd = $_GET['cmd']; if ($cmd == 'getip') { echo remoteip(); { { testport($_GET['port'],$_GET['timeout']); } else { testport($_GET['port'],30); } { { updateip(); } } } } ?>
Y las tablas que uso (mysql) son estas:
Básicamente lo que hace el código en php es que cada vez que alguien accede a esa pagina, pasándole como parámetro el numero de cliente, graba la ip en la tabla correspondiente.
Así que el código en delphi es tan sencillo como este:
uses WinInet, IniFiles; const Version = '1.0'; Url = 'http://www.mipagina.com/agent.php'; function SendCmd(Cmd: String): String; var hNet: HINTERNET; hUrl: HINTERNET; Buffer: Array[0..256] of Char; BytesRead: DWORD; begin Result:= EmptyStr; hNet:= InternetOpen('agent', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); if (hNet <> nil) then begin hUrl := InternetOpenUrl(hNet, PChar(Url + Cmd), nil, 0, INTERNET_FLAG_RELOAD, 0); if (hUrl <> nil) then begin FillChar(Buffer,Sizeof(Buffer),0); if InternetReadFile(hUrl, @Buffer, sizeof(Buffer)-1, BytesRead) then Result:= Trim(Copy(Buffer,1,BytesRead)); InternetCloseHandle(hUrl); end; InternetCloseHandle(hNet); end; end; // Solo tenemos que llamar a esta función periódicamente para mantener la ip actualizada. // Uid es el identificador del cliente, el mismo de la tabla de clientes SendCmd('?cmd=updateip&uid=' + IntToStr(Uid));
Ahora solo falta mostrar la lista en una bonita pagina web, pero lejos de las miradas de los curiosos.
Nota: Si le encontráis algún error al código es porque he tenido que cortar algunas partes relacionadas con mi trabajo, y puede que se me fuera la tijera me avisáis y lo corrijo.