2009-12-02 15 views
8

Ho qualche tipo di problema e non riesco a controllarlo a casa se funziona o meno. Ecco il codiceImpossibile connettersi dalla macchina remota

using System; 
using System.Net; 
using System.Net.Sockets; 
using System.Threading; 
using System.IO; 
using System.Net.Security; 

class Program 
{ 
    private static IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 
    private static int port = 6000; 
    private static string data = null; 

    static void Main(string[] args) 
    { 
     Thread thread = new Thread(new ThreadStart(receiveThread)); 
     thread.Start(); 
     Console.ReadKey(); 
    } 

    public static void receiveThread() 
    { 
     while (true) 
     { 
      TcpListener tcpListener = new TcpListener(ipAddress, port); 
      tcpListener.Start(); 

      Console.WriteLine("Waiting for connection..."); 

      TcpClient tcpClient = tcpListener.AcceptTcpClient(); 

      Console.WriteLine("Connected with {0}", tcpClient.Client.RemoteEndPoint); 

      while (!(tcpClient.Client.Poll(20, SelectMode.SelectRead))) 
      { 
       NetworkStream networkStream = tcpClient.GetStream(); 
       StreamReader streamReader = new StreamReader(networkStream); 

       data = streamReader.ReadLine(); 

       if(data != null) 
        Console.WriteLine("Received message: {0}", data); 
      } 
      Console.WriteLine("Dissconnected...\n"); 
      tcpListener.Stop(); 
     } 
    } 
} 

Ho un programma semplice e di connettersi a questo e poi inviare una stringa con i dati. Funziona bene su localhost ma c'è un problema quando sto cercando di connettermi con un altro computer.

Ho persino spento il firewall sul mio PC e router, come ho fatto sul portatile del mio amico. Ogni volta che ho provato a connettermi, il suo computer ha rifiutato la connessione. Forse sto facendo qualcosa di sbagliato?

Ovviamente, ipAddress è un indirizzo locale ora poiché funziona solo con quello al momento. Qualche suggerimento su cosa fare?

risposta

12

è necessario impostare per accettare connessioni da qualsiasi IP, v'è una funzione di sovraccarico IPAddress per questo:

System.Net.IPAddress.Any 

usarlo al posto di 127.0.0.1 e sarà risolvere il problema.

1

Penso che sia il computer (il server) che rifiuta di connettersi perché 127.0.0.1 è locale (-solo).

Provate questo semplice sovraccarico:

TcpListener tcpListener = new TcpListener(port); 
+0

Si dice che questo metodo sia stato deprecato. Ho usato un ip localhost dal momento che sto ascoltando sul mio computer per la connessione in entrata. Penso che dovrebbe funzionare così com'è, o sbaglio? – Allek

+0

127001 è solo il tuo PC _da da quel PC stesso. È necessario ascoltare su un IP esterno visibile, vedere l'indirizzo IpDisponibile. Qualsiasi risposta. –

4

Stai ascoltando su 127.0.0.1, che è l'indirizzo di loopback, che è un indirizzo speciale che significa 'questo computer'. Ciò significa che accetti solo le connessioni effettuate sulla stessa macchina su cui è in esecuzione il server.

È necessario ascoltare su uno (o più) indirizzi IP reali del server.

+0

Quindi dovrei usare l'IP "my internet" per ascoltare le connessioni in entrata? – Allek

+0

È possibile utilizzare IPAddress.Any per ascoltare TUTTE le proprie interfacce o l'indirizzo di una particolare interfaccia per ascoltare JUST su tale interfaccia. Se hai bisogno di ascoltare su molte delle tue interfacce, ma non tutte, hai bisogno di un ascoltatore per indirizzo. –

3

Il problema è che l'impostazione di un indirizzo IP esplicitamente quando si inizializza TcpListener consentirà solo di accettare le connessioni da all'indirizzo. Pertanto, inserendo l'indirizzo locale di 127.0.0.1 si accettano solo connessioni provenienti dal tuo PC.

L'implementazione che si desidera utilizzare è la seguente:

TcpListener tcpListener = new TcpListener(IPAddress.Any, port); 

Questa volontà consente le connessioni da qualsiasi indirizzo IP per la connessione al vostro programma sulla porta specificata.

Problemi correlati