2009-07-27 76 views
5

我正在用C#做一個遊戲,我想顯示對手的進度(動作等)。所以我通過TCP協議將遊戲中的事件發送給對手。如何解決「連接嘗試失敗,因爲連接方在一段時間後沒有正確響應......」錯誤?

我已經嘗試過在本地主機上我的應用程序和它的作品,但是當我試圖儘可能地使用我的外部地址在互聯網上進行交流,我得到下面的錯誤類TcpInformer.Connect():

連接嘗試失敗,因爲連接的方沒有正確 一段時間後響應或已建立的連接失敗,因爲連接的主機沒有

我想回應(我的外部IP地址):(端口)問題是我是beh ind NAT。但是我已經在IP 10.0.0.1上爲端口49731設置了portforwarding,並且沒有任何改變。

我的第二個猜測是Windows防火牆,但即使當我停止防火牆,我的應用程序沒有開始工作。

我對兩臺PC連接的代碼是:



     TcpInformer peer; 
     TcpHost server; 

     public void PrepareConnection() // for server (host) 
     { 
      playerType = PlayerType.One; 
      server = new TcpHost(form, this); 
      server.Start("10.0.0.1", 49731); 
     } 

     public void PrepareConnection2() // for client 
     { 
      playerType = PlayerType.Two; 
      peer = new TcpInformer(form, this); 
      peer.Connect("MY EXTERNAL IP", 49731); 
     } 


// classes TcpHost and TcpInformer 

    public interface ITcpCommunication 
    { 
     #region Operations (3)  

     void ReadData(); 

     void SendData(byte[] message); 

     void SendData(byte[] message, int size); 

     #endregion Operations  
    } 

    public class TcpInformer : ITcpCommunication 
    { 
     #region Fields (9)  

     private NetworkStream con_ns; 
     private TcpClient con_server; 
     private bool connected; 
     private Fmain form; 
     private SecondPlayer player; 
     private int port; 
     private string server; 
     private string stringData; 

     #endregion Fields  

     #region Delegates and Events (1) 

     // Events (1)  

     public event SimulationEventHandler ReadEvent; 

     #endregion Delegates and Events  

     #region Constructors (1)  

     public TcpInformer(Fmain form, SecondPlayer player) 
     { 
      this.form = form; 
      connected = false; 
      this.player = player; 
     } 

     #endregion Constructors  

     #region Methods (6)  

     // Public Methods (5)  

     /// 
     /// 
     /// 
     /// e.g., server = "127.0.0.1" 
     /// e.g., port = 9050 
     public void Connect(string server, int port) 
     { 
      this.port = port; 
      this.server = server; 
      connected = true; 

      try 
      { 
       con_server = new TcpClient(this.server, this.port); 
      } 
      catch (SocketException ex) 
      { 
       connected = false; 
       MessageBox.Show("Unable to connect to server" + ex.Message); 
       return; 
      } 

      con_ns = con_server.GetStream(); 
     } 

     public void Disconnect() 
     { 
      form.Debug("Disconnecting from server...", "Player2Net"); 
      con_ns.Close(); 
      con_server.Close(); 
     } 

     public void ReadData() 
     { 
      if (con_ns != null) 
      { 
       if (con_ns.DataAvailable) 
       { 
        byte[] data = new byte[1200]; 
        int received = con_ns.Read(data, 0, data.Length); 

        player.ProcessReceivedData(data, received); 
       } 
      } 
      else 
      { 
       form.Debug("Warning: con_ns is not inicialized.","player2"); 
      } 
     } 

     public void SendData(byte[] message) 
     { 
      con_ns.Write(message, 0, message.Length); 
      con_ns.Flush(); 
     } 

     public void SendData(byte[] message, int size)   
     { 
      if (con_ns != null) 
      { 
       con_ns.Write(message, 0, size); 
      } 
     } 
     // Private Methods (1)  

     private void Debug(string message) 
     { 
      form.Debug("Connected to: " + server + "port: " + port.ToString() + ": " + message, "Player2Net"); 
     } 

     #endregion Methods  
    } 

    public class TcpHost : ITcpCommunication 
    { 
     #region Fields (9)  

     private ASCIIEncoding enc; 
     private Fmain form; 
     private TcpListener listener; 
     private SecondPlayer player; 
     private int port; 
     private Socket s; 
     private string server; 
     private bool state; 

     #endregion Fields  

     #region Delegates and Events (1) 

     // Events (1)  

     public event SimulationEventHandler ReadEvent; 

     #endregion Delegates and Events  

     #region Constructors (1)  

     public TcpHost(Fmain form, SecondPlayer player) 
     { 
      this.player = player; 
      this.form = form; 
      state = false; 
      enc = new ASCIIEncoding(); 
     } 

     #endregion Constructors  

     #region Methods (5)  

     // Public Methods (5)  

     public void Close() 
     { 
      state = false; 
      s.Close(); 
      listener.Stop(); 
     } 

     public void ReadData() 
     { 
      if (state == true) 
      { 
       if (s.Available > 0) // if there's any data 
       { 
        byte[] data = new byte[1200]; 
        int received = s.Receive(data); 
        player.ProcessReceivedData(data, received); 
       } 
      } 
     } 

     public void SendData(byte[] message) 
     { 
      if (state == true) 
      { 
       s.Send(message); 
      } 
     } 

     public void SendData(byte[] message, int size) 
     { 
      if (state == true) 
      { 
       s.Send(message, size, SocketFlags.None); 
      } 
     } 

     public void Start(string p_ipAddress, int listenPort) 
     { 
      //IPAddress ipAddress = IPAddress.Loopback 
      IPAddress ipAddress = IPAddress.Parse(p_ipAddress); 

      IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, listenPort); 

      //listener = new TcpListener(ipAddress, listenPort); 
      listener = new TcpListener(ipLocalEndPoint); 
      server = "[provider]"; 
      port = listenPort; 
      listener.Start(); 
      form.Debug("Server is running", "Player1Net"); 
      form.Debug("Listening on port " + listenPort, "Player1Net"); 
      form.Debug("Waiting for connections...", "Player1Net"); 
      s = listener.AcceptSocket(); 
      form.Debug("Connection accepted from " + s.RemoteEndPoint, "Player1Net"); 
      state = true; 
     } 

     #endregion Methods  
    } 


有沒有辦法如何檢查有什麼不好? 非常感謝幫助!

+1

我發現了什麼問題。我正在監聽10.0.0.1並試圖訪問我的外部IP(我的程序的第二個實例),這在一臺連接到互聯網的計算機上是不可能的。 我應該刪除這篇文章嗎? – 2009-07-29 10:58:00

回答

6

我發現了什麼問題。我正在監聽10.0.0.1並試圖訪問我的外部IP(我的程序的第二個實例),這在一臺連接到互聯網的計算機上是不可能的。

0

我在AWS VPN中也面臨同樣的問題。

我將proxy.company.com(external ip)更改爲10.0.0.5。

它現在起作用了。

相關問題