Domanda

Ho un'applicazione stile client / server che comunica utilizzando WCF che tutte le grandi opere. Una funzione dell'applicazione è quello di ottenere i file dal computer client al server (Central Control).

Il controllo centrale richiede un elenco di file in una cartella specificata sul client e si apre una porta che utilizza i socket per i clienti di connettersi e trasmettere ciascun file. Esso utilizza un numero di porta diverso per ogni file.

Questo ha funzionato bene durante il test a livello locale, ma quando schierato per il nostro ambiente clienti ho cominciato a ricevere la seguente eccezione.

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()

L'indirizzo IP del punto finale è un 10. . . * Indirizzo. Ho cercato su google su una risposta e il consenso generale era che con TcpListener non può legarsi con un indirizzo IP esterno. Non pensavo che un 10. . . * indirizzo era esterno.

Il codice che genera l'eccezione è la seguente:

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

Non c'è modo che posso utilizzare un TcpListener per questo lavoro? Quali alternative ci sono, se non e come sarebbe facile per attuare le alternative.

Tenete a mente che non abbiamo accesso alla configurazione del firewall direttamente, e un cambiamento potrebbe prendere un certo numero di settimane per essere implementato.

È stato utile?

Soluzione

L'applicazione deve legarsi soltanto all'indirizzo IP interno della macchina. Il problema è che il firewall non passa automaticamente l'indirizzo IP esterno attraverso l'indirizzo IP interno tramite Port Forwarding. Dal momento che non si può facilmente modificare la configurazione del firewall, ci sono 3 alternative:

  1. Usa UPnP (Universal Plug N Play) i comandi dalla vostra applicazione al router per aprire il selezionato porta. UPnP non verrà attivato per più sicuro configurazioni di firewall.
  2. (Più complicato) Utilizzare TCP Hole punzonatura per stabilire una connessione attraverso il firewall.
  3. Cambia il senso in modo che i client si connettono al server. Il server apre una porta dinamicamente tramite un comando UPnP o semplicemente ha un blocco di porte aperte nel firewall per l'utilizzo da questa applicazione.

    Per entrambi i casi, assicurarsi che la connessione WCF è protetta in modo che chiunque altro non può venire lungo via port scanning e accedere ai file senza autorizzazione.

Altri suggerimenti

Questa eccezione si verifica in genere quando si sta cercando di associare a un indirizzo che non è valido sulla macchina. È l'indirizzo IP che si sta tentando di legarsi ai assegnato ad una delle interfacce di rete sulla macchina?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top