Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   usar upnp con Delphi para configurar nat en un router? (https://www.clubdelphi.com/foros/showthread.php?t=54514)

maro 21-03-2008 11:02:35

usar upnp con Delphi para configurar nat en un router?
 
Hola,

He leído en algunas páginas, por Internet, que utilizando upnp es posible añadir un registro a la tabla de nat del router, de tal forma que un programa que contenga un servidor tcp pueda "escuchar" de forma transparente, sin que el usuario tenga que configurar el router o firewall.

Incluso he encontrado este código:
Código Delphi [-]
Procedure AddUPnPEntry( Port : Integer;  const Name : ShortString);
Var
  Nat   : Variant;
  Ports : Variant;
Begin
  if NOT (LAN_IP = '127.0.0.1') then
  begin
    try
      Nat := CreateOleObject('HNetCfg.NATUPnP');
      Ports := Nat.StaticPortMappingCollection;
                        showMessage(inttostr(Ports.count));
      Ports.Add(port, 'TCP', port, LAN_IP, True, name);
    except
      ShowMessage(
        'An Error occured with adding UPnP Ports. The ' + name +
        ' port was not added to the router.  Please check to see if your ' +
        'router supports UPnP and has it enabled or disable UPnP.'
      );
    end;
    {[2006/03/04] CR - I'd looked into other ways to handle errors, but,
     unfortunately the try-except Alex used here originally is the ONLY way
     to trap errors.  OLE/.COM bites, if you have to rely on exceptions all the
     time! :P~~ }
  end;
End; { Proc AddUPnPEntry}

pero no consigo que funcione.

¿Alguén sabe algo sobre este tema?

Muchas gracias.
Un Saludo.

seoane 21-03-2008 13:23:04

Antes de nada ¿te aseguraste de que tu router soporta UPnP y que esta habilitado? :confused:

seoane 21-03-2008 13:52:45

Y se me olvidaba para que funcione tienes que tener instalado "Interfaz de usuario UPnP". Lo puedes instalar des "Agregar y quitar progrmas" -> "Agregar o quitar componentes de windows" -> "Servicios de red" -> "Interfaz de usuario UPnP

maro 24-03-2008 07:43:44

Gracias Seoane,

El router si soporta UPnP y está habilitado. Igualmente, tengo instalado Windows XP y también tengo instalado el servicio (tal como comentas) de uPnP.

Pero... al ejecutar el código que indiqué, delphi me da un access violation.

Alguna sugenrecia?

gracias nuevamente.
Un Saludo.

seoane 24-03-2008 23:13:48

Me pregunto en que tipo de aplicación estas usando esa función ¿con formularios? ¿de consola?. De todas formas prueba utilizando la función CoInitialize antes de llamar a la función.

Por lo demás a mi me funciona perfectamente

maro 25-03-2008 07:40:15

Hola de nuevo.

Pues la verdad es que no ando muy espavilao con este código, es decir, que es la primera vez que utilizo upnp y logicamente ando un poco perdido.

Para probarlo, lo estoy ejecutando desde un formulario normal y corriente.
¿debería funcionar en un formulario?

Depurando el código veo que en esta línea:
Código Delphi [-]
Ports := Nat.StaticPortMappingCollection;
La variable "Ports" tiene asignada la dirección $00000000 y al ejecutar la siguiente línea:
Código Delphi [-]
Ports.Add(port, 'TCP', port, LAN_IP, True, name);
da el access violation.

He introducido la línea CoInitialize(nil); al principio de la función y obtengo el mismo resultado.

Gracias por contestar seoane.
Un Saludo.

maro 25-03-2008 08:24:23

Perdona de nuevo Seasone,

¿Sabes algo sobre esto (me tiene intrigado)?:

Si tengo dos redes y en ambas desactivo la opción de upnp de los routers: ¿Como puede ms Messenger conectar directamente a mi ip pública para mantener una conversación entre dos usuarios? (un usuario de cada red, claro)

Gracias.
Un Saludo.

seoane 25-03-2008 14:50:42

Cita:

Empezado por maro (Mensaje 275058)
Si tengo dos redes y en ambas desactivo la opción de upnp de los routers: ¿Como puede ms Messenger conectar directamente a mi ip pública para mantener una conversación entre dos usuarios? (un usuario de cada red, claro)

El msn no necesita tener los puertos abiertos del router para mantener una conversación, ni siquiera necesita estar directamente conectado a internet ya que es capaz de salir a través de un proxy http. Es el rey saltándose limitaciones :D

Piensa que durante una conversación de messenger ambos clientes están conectados al servidor de msn y no conectados entre si. Solo se conectan directamente entre ellos cuando se envían un fichero, o se utiliza la cámara web o el micrófono. En esos casos, solo hace falta que uno de los dos tenga un puerto abierto.

maro 25-03-2008 16:19:55

Cita:

Empezado por seoane (Mensaje 275086)
Piensa que durante una conversación de messenger ambos clientes están conectados al servidor de msn y no conectados entre si. Solo se conectan directamente entre ellos cuando se envían un fichero, o se utiliza la cámara web o el micrófono. En esos casos, solo hace falta que uno de los dos tenga un puerto abierto.

Cierto, totalmente de acuerdo. Me confundí entre mantener conversaciones y enviar ficheros.
No obstante, lo que me intriga es que en mi caso, con upnp descativado en los dos router al enviar un fichero por ms messenger (de un usuario de una red a otro de otra red) crea una conexión directa entre las ip's publicas de ambos routers :confused:

Creo que ... ¿es imposible realizar conexiones directas por socket's sin redireccionar puertos (cuando hay routers por medio, claro)? ¿no?

Gracias seoane y perdona la guerra que te estoy dando con este tema.


La franja horaria es GMT +2. Ahora son las 20:24:35.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi