2017-10-20 303 views
0

爲了學習目的,我開發了一個在本地網絡上工作的異步服務器/客戶端應用程序。但是現在我想讓它能夠連接到我的公共IP地址,所以我的服務器可以從任何地方訪問。C#公共IP客戶端/服務器

這裏是服務器代碼的相關部分,它似乎是工作得很好:

static void Main(string[] args) 
    { 
      AsyncServer server = new AsyncServer(60101); 
      server.RunAsync(); 
      Console.Read(); 
    } 

public class AsyncServer 
{ 
    private IPAddress ipAddress; 
    private int port; 

    public AsyncServer(int port) 
    { 
     this.port = port; 
     IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); 
     this.ipAddress = null; 
     for (int i = 0; i < ipHostInfo.AddressList.Length; i++) 
     { 
      if (ipHostInfo.AddressList[i].AddressFamily == AddressFamily.InterNetwork) 
      { 
       this.ipAddress = ipHostInfo.AddressList[i]; 
       break; 
      } 
     } 
     if (this.ipAddress == null) 
      throw new Exception("No IPv4 address for server."); 
    } 

    public async void RunAsync() 
    { 
     TcpListener tcpListener = new TcpListener(this.ipAddress, this.port); 
     tcpListener.Start(); 

下面是客戶端代碼的相關部分。這是它無法連接的地方。

static void Main(string[] args) 
    { 
      AsyncClient client = new AsyncClient("MyPublicIP", 60101); 
      client.ConnectAsync().Wait(); 
      Console.Read(); 
    } 
} 

public class AsyncClient 
{ 
    private IPAddress ipAddress; 
    private int port; 

    public AsyncClient(string ip, int port) 
    { 
     this.port = port; 
     IPAddress.TryParse(ip, out ipAddress); 
    } 

    public async Task ConnectAsync() 
    { 
     int attempts = 0; 
     TcpClient client = new TcpClient(); 
     while (!client.Connected) 
     { 
      try 
      { 
       attempts++; 
       client.Connect(this.ipAddress, this.port); 
       Console.Clear(); 
       Console.WriteLine("Connected"); 
       await ProcessAssync(client); 
      } 
      catch (SocketException) 
      { 
       Console.Clear(); 
       Console.WriteLine("Connection Attempts: {0}", attempts); 

我已經在我的路由器上進行端口轉發到我的本地服務器IP「192.168.254.1」所使用的端口「60101」,但沒有什麼變化,他只是不斷嘗試出現了一會兒,然後失敗連接。

+0

他不會被連接到192.168.254.1 ..他需要你的互聯網IP地址,這就是當地的一個 – BugFinder

+0

是,192.168.254.1是我的地方IP,但這是我需要的服務器的權利?因此,服務器會監聽給定端口上發送給此IP的所有內容,就像我設置端口轉發一樣。然後在客戶端上,我不試圖連接到它,它試圖連接到我的公共IP。這不是應該如何? –

+1

是的,這聽起來正確。所以問題可能是ISP過濾或轉發不工作或其他事情。 –

回答

-2

嘗試http://www.whatsmyip.org/並解析該IP。對於服務器也許會更好地使用IPAddress.Any

+1

一般來說,當在NAT後面(非常常見)時,您的公共IP將分配給您的調制解調器/路由器,而不是您的PC。 – CodeCaster

0

你真的想/需要限制服務器只偵聽一個接口?

當您僅使用端口號啓動TcpListener但沒有IP地址時,TcpListener將偵聽所有接口。通過您的代碼,TcpListener將在第一個接口上使用IPv4 IP地址進行onyl監聽。但是這可能是您的路由器不可用的接口(例如虛擬主機提供的內部接口)。

我將服務器代碼更改爲類似這樣:

public class AsyncServer 
{ 
    private int port; 

    public AsyncServer(int port) 
    { 
     this.port = port; 
    } 

    public async void RunAsync() 
    { 
     TcpListener tcpListener = new TcpListener(IPAddress.Any, this.port); 
     tcpListener.Start();