Comment fixer « une tentative de connexion a échoué car le parti connecté n'a pas répondu correctement après une période de temps ... » erreur?

StackOverflow https://stackoverflow.com/questions/1187783

  •  19-09-2019
  •  | 
  •  

Question

Je fais un jeu en C # et je veux afficher les progrès (mouvements et ainsi de suite) de l'adversaire. J'envoie des événements dans le jeu via le protocole TCP à l'adversaire.

Je l'ai déjà essayé de mon application sur localhost et il fonctionne, mais lorsque je tente d'utiliser mon adresse externe afin de communiquer sur Internet, je reçois l'erreur ci-dessous en classe TcpInformer.Connect ():

  

une tentative de connexion a échoué car le parti connecté n'a pas répondu correctement après une   période de temps, ou une connexion établie a échoué car l'hôte de connexion n'a pas   répondre (mon adresse IP externe) :( Port)

Je pensais que le problème était que j'étais derrière NAT. Mais je l'ai déjà mis en place pour portforwarder 49731 de port sur IP 10.0.0.1 et rien changé.

Ma deuxième estimation était le pare-feu Windows, mais même quand je me suis arrêté le pare-feu mon application n'a pas commencé à travailler.

Mon code pour la connexion des deux PC est:



        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 
    }


Est-il possible comment vérifier ce qui est faux? L'aide est très appréciée!

Était-ce utile?

La solution

J'ai découvert quel était le problème. J'écoutais sur 10.0.0.1 et en essayant d'atteindre mon IP externe (deuxième instance de mon programme) qui est impossible sur un ordinateur avec une connexion à Internet.

Autres conseils

J'ai aussi fait face au même problème dans VPN AWS.

J'ai changé le proxy.company.com (IP externe) à 10.0.0.5.

Et cela fonctionne maintenant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top