2011-10-16 63 views
2

這與c#套接字有關。 我正在開發套接字程序。但是我的軟件有一個問題。 我無法連接到通過他們的本地網絡連接到互聯網的電腦。但我可以連接到單獨使用互聯網的電腦。更具描述性, 考慮到5臺計算機通過使用1個IP地址的調制解調器連接互聯網。當我嘗試訪問這些計算機之一時,API通過其IP地址連接到調制解調器。但沒有迴應。由於調制解調器不響應計算機請求。平均而言,我的API不僅需要調制解調器才能連接電腦。並且拋出一個SocketException。我可以對這個問題做些什麼?如何通過IP地址連接電腦

回答

3

您遇到的問題是由NAT造成的。這由允許多個客戶端通過一個公共IP地址聯機的路由器使用。路由器後面的客戶端都不會「知道」或「看到」這個,但它限制了連接。

客戶端可以啓動到外部的連接,但其他方式基本上是不可能的。除非使用port forwarding,否則將一個或多個端口轉發到路由器後面的客戶端。這樣,連接可以從外部啓動。

然而,這需要在客戶端進行配置,所以首選的方法是讓您的客戶端連接到您的服務器,因爲這將始終可能(忽略防火牆)。

*:還有一種解決方法,您讓客戶端連接到您的服務器,然後將連接信息傳遞給另一個客戶端,以便這些客戶端可以相互通信。例如,這被稱爲'nat punching',並被洪流客戶端使用。

1

,你可以嘗試這樣的事情.....

服務器端代碼

namespace Consoleserver 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 

     IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); 
    IPAddress ipAddress = ipHostInfo.AddressList[0]; 
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); 


    Socket listener = new Socket(AddressFamily.InterNetwork, 
     SocketType.Stream, ProtocolType.Tcp); 


    try 
    { 
     listener.Bind(localEndPoint); 
     listener.Listen(10); 


     while (true) 
     { 
      Console.WriteLine("Waiting for a connection..."); 

      Socket handler = listener.Accept(); 
      Console.WriteLine("connected"); 
     } 

    } 
    catch { Console.WriteLine("error"); 
    } 
    } 
} 

客戶端代碼:

namespace consoleclient 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     try 
     { 

      IPHostEntry ipHostInfo = Dns.Resolve("59.178.131.180"); 
      IPAddress ipAddress = ipHostInfo.AddressList[0]; 
      IPEndPoint remoteEP = new IPEndPoint(ipAddress, 11000); 


      Socket sender = new Socket(AddressFamily.InterNetwork, 
       SocketType.Stream, ProtocolType.Tcp); 


      try 
      { 
       sender.Connect(remoteEP); 

       Console.WriteLine("Socket connected <strong class="highlight">to</strong> {0}", 
        sender.RemoteEndPoint.ToString()); 
      } 
      catch (ArgumentNullException ane) 
      { 
       Console.WriteLine("ArgumentNullException : {0}", ane.ToString()); 
       Console.Read(); 
      } 
      catch (SocketException se) 
      { 
       Console.WriteLine("SocketException : {0}", se.ToString()); 
       Console.Read(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Unexpected exception : {0}", e.ToString()); 
       Console.Read(); 
      } 

     } 
     catch 
     { Console.WriteLine("could not <strong class="highlight">connect</strong> A"); } 
    } 
    } 
} 

我希望它會幫助你

相關問題