Bueno, hace unos años estuve investigando y peleándome un poco con la posibilidad de abrir los puertos del router (UPnP) desde Delphi, lo cual aseguran que es posible, pero a mí nunca me llegó a funcionar. Nuestra aplicación utiliza una BD Cliente/Servidor que requiere abrir un puerto específico del router, y en la empresa estamos un poco hartos de tener que hacerlo nosotros porque el cliente no sabe ni lo que es un router, ni un puerto... ni abrir.
Internet está lleno de ejemplos de código, e incluso programas ya compilados (en Delphi, Java, C, etc.) pero lo cierto es que ninguno de ellos funciona con mi router.
Primero voy con el código. A continuación pongo el código fuente para mostrar los puertos abiertos del router. Por supuesto, el router tiene que ser compatible con UPnP y tener esa característica activada.
Código Delphi
[-]
procedure ListUPnPEntries;
var
Nat : Variant;
Ports : Variant;
Port : OleVariant;
IntPort, ExtPort : Integer;
Desc, Protocol, IntClient, ExtIP, InternalPort : WideString;
Enabled: Boolean;
foreach: IEnumVariant;
enum: IUnknown;
i:integer;
begin
try
Nat := CreateOleObject('HNetCfg.NATUPnP');
Ports := Nat.StaticPortMappingCollection;
*
Enum := Ports._NewEnum;
foreach := enum as IEnumVariant;
*
while foreach.Next(1, Port, PDWORD(0)^) = 0 do
begin
Desc := Port.Description;
Enabled := Port.Enabled;
ExtIP := Port.ExternalIPAddress;
ExtPort := Port.ExternalPort;
IntClient := Port.InternalClient;
InternalPort := Port.InternalPort;
Protocol := Port.Protocol;
*
form1.memo1.lines.append(ExtPort+' '+desc+' '+protocol+' '+ExtIP);
end;
except
on e:Exception do
ShowMessage(e.Message);
end;
end;
Bien. El código anterior "funciona". El problema es que los puertos que devuelve no tienen NADA que ver con los que tengo abiertos en el router, así que no sé de donde los saca
Este otro código permite abrir un puerto, indicando a qué IP Local redirigir las comunicaciones:
Código Delphi
[-]
procedure AddPort;
var
Nat : Variant;
Ports : Variant;
Port : OleVariant;
i:integer;
begin
try
Nat := CreateOleObject('HNetCfg.NATUPnP');
Ports := Nat.StaticPortMappingCollection;
*
Ports.Add ( 12345, 'TCP', 12345, '192.168.1.15', True, 'test')
*
except
on e:Exception do
ShowMessage(e.Message);
end;
end;
Pero ni caso.
Me he leído creo que las 10 primeras páginas de resultados de Google para "Delphi upnp port forwarding" y similares. El código es correcto y , según dicen, funciona.
Así que... ¿alguien lo ha conseguido alguna vez? ¿Es cosa de mi router? He probado a desactivar el Firewall propio del router, pero tampoco.
He encontrado también ejemplos que permiten comunicarse con dispositivos UPnP desde Delphi (no necesariamente routers, también altavoces bluetooth, etc.) y supuestamente, una vez conectados, podemos hacer (casi) lo que queramos con ellos, pero no hay mucha información al respecto.
Me parece raro que los puertos que me devuelve la función anterior no tengan nada que ver con los abiertos en el router. ¿De donde los saca? ¿Estaré haciendo la petición a OTRO dispositivo uPnP y no al router?!!?
Pues eso, cualquier información será bienvenida.