socket net example c# sockets tcp nat

c# - net - Cómo solucionar "error en un intento de conexión porque la parte conectada no respondió correctamente después de un período de tiempo..." ¿error?



tcp ip c# net example (2)

Estoy haciendo un juego en C # y quiero mostrar el progreso (movimientos, etc.) del oponente. Así que envío eventos en el juego a través del protocolo TCP al oponente.

Ya probé mi aplicación en localhost y funciona, pero cuando trato de usar mi dirección externa para comunicarme por Internet obtengo el siguiente error en la clase TcpInformer.Connect ():

falló un intento de conexión porque la parte conectada no respondió correctamente después de un período de tiempo, o la conexión establecida falló porque el host conectado no ha respondido (mi dirección IP externa) :( puerto)

Pensé que el problema era que estaba detrás de NAT. Pero ya configuré portforwarding para el puerto 49731 en IP 10.0.0.1 y nada cambió.

Mi segunda conjetura fue el firewall de Windows, pero incluso cuando detuve el firewall, mi aplicación no comenzó a funcionar.

Mi código para conectar las dos PC es:

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  }

¿Hay alguna manera de verificar qué está mal? ¡La ayuda es muy apreciada!


Descubrí cuál era el problema. Estaba escuchando en 10.0.0.1 y tratando de llegar a mi IP externa (segunda instancia de mi programa) que es imposible en una computadora con una conexión a internet.


También enfrenté el mismo problema en AWS VPN.

Cambié el proxy.company.com (IP externo) a 10.0.0.5.

Y funciona ahora.