2009-12-02 193 views
8

我有一些問題,我不能檢查這在家裏,如果它的工作與否。 下面是代碼無法從遠程機器連接

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

我有一個簡單的程序,以及連接到這一點,然後用發送數據的字符串。它在本地主機上工作正常,但當我試圖連接不同的計算機時出現問題。

我甚至關閉了我的PC和路由器上的防火牆,就像我在朋友的筆記本電腦上一樣。每次我嘗試連接時,他的電腦都拒絕連接。也許我做錯了什麼?

當然,ipAddress現在是一個本地地址,因爲它現在只適用於此。有什麼建議做什麼?

回答

12

您需要將其設置爲從任何IP接受連接,還有一個ip地址超載功能如下:

System.Net.IPAddress.Any 

用它代替127.0.0.1,它會解決您的問題。

1

我認爲這是您的計算機(服務器)拒絕連接,因爲127.0.0.1是本地(僅限)。

試試這個簡單的過載:

TcpListener tcpListener = new TcpListener(port); 
+0

據說這種方法已被棄用。我使用本地主機ip,因爲我在我的電腦上監聽傳入連接。我認爲它應該像現在這樣工作,還是我錯了? – Allek

+0

127001只是您PC的PC自身。您需要聽取外部可見的IP,然後查看IpDdress.Any的答案。 –

4

你在聽127.0.0.1是環回地址這是一個特殊的地址,這意味着「這臺計算機」。這意味着您將只接受在服務器運行時在同一臺機器上進行的連接。

您需要監聽一個(或多個)服務器的真實IP地址。

+0

所以我應該使用那裏「我的互聯網」ip來監聽傳入連接? – Allek

+0

您可以使用IPAddress.Any監聽所有接口或某個特定接口的地址,以在該接口上偵聽JUST。如果您需要監聽幾個接口,但不是全部,那麼每個地址需要一個監聽器。 –

3

您的問題是,初始化TcpListener時顯式設置IP地址將只允許它接受來自的地址的連接。因此,輸入127.0.0.1的本地地址將只接受源自PC的連接。

您要使用的實現方式如下:

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

這將允許來自任何IP地址的連接來連接到你的程序在指定的端口上。