Pregunta

Tengo una aplicación de estilo de cliente / servidor que se comunica utilizando WCF, que todo funciona muy bien. Una de las funciones de la aplicación es para obtener los archivos de las máquinas de cliente en el servidor (control central).

El control central solicita una lista de archivos en una carpeta especificada en el cliente y se abre un puerto mediante zócalos para los clientes conectarse y transmitir cada archivo. Se utiliza un número de puerto diferente para cada archivo.

Esto funcionó bien cuando se prueba de forma local, pero cuando se despliega a nuestro medio ambiente clientes empecé a recibir la siguiente excepción.

The requested address is not valid in its context
   at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)
   at System.Net.Sockets.Socket.Bind(EndPoint localEP)
   at System.Net.Sockets.TcpListener.Start(Int32 backlog)
   at System.Net.Sockets.TcpListener.Start()
   at AMIGA.Library.TransferFile.listenerThread()

La dirección IP en el punto final es un 10. . . * Dirección. Busqué en Google acerca de una respuesta y el consenso general fue que con TcpListener no puede unirse con una dirección IP externa. No pensé que un 10. . . * Dirección era externa.

El código que produce la excepción es la siguiente:

tcpListener = New TcpListener(IEndPoint)
Dim handlerSocket As Socket
Dim thdHandler As Thread
tcpListener.Start()
RequestFile()

¿No hay manera de que pueda utilizar un TcpListener para este trabajo? ¿Qué alternativas existen si no, y cómo fácil sería para implementar las alternativas.

Tenga en cuenta que no tenemos acceso a la configuración del cortafuegos directamente, y un cambio podría tomar varias semanas para ser implementado.

¿Fue útil?

Solución

Su aplicación debe unirse solamente a la dirección IP interna en la máquina. El problema es que el servidor de seguridad no pasa automáticamente la dirección IP externa a través de la dirección IP interna a través de puertos. Como no se puede modificar fácilmente la configuración del cortafuegos, existen 3 alternativas:

  1. Usar UPnP (Universal Plug N Play) manda desde su aplicación al router para abrir el seleccionado Puerto. UPnP no será habilitado más seguro configuraciones de cortafuegos.
  2. (más complicado) Uso TCP agujero perforación para establecer una conexión a través del firewall.
  3. Cambiar el sentido de modo que los clientes se conectan al servidor. El servidor abre un puerto de forma dinámica a través de un comando UPnP o simplemente tiene un bloque de puertos abiertos en el servidor de seguridad para el uso de esta aplicación.

    En cualquier caso, asegúrese de que la conexión WCF está protegido por la seguridad de manera que cualquier otra persona no puede venir a través de la exploración de puertos y acceder a los archivos sin autorización.

Otros consejos

Esta excepción se produce normalmente cuando se está tratando de obligar a una dirección que no es válida en la máquina. Es la dirección IP que está intentando unirse a asignado a una de las interfaces de red en la máquina?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top