Как исправить неудачную попытку подключения из-за того, что подключенная сторона не ответила должным образом через некоторое время?

Я делаю игру на С# и хочу отображать прогресс (движения и т. д.) противника. Поэтому я отправляю события в игре по протоколу TCP противнику.

Я уже пробовал свое приложение на локальном хосте, и оно работает, но когда я пытаюсь использовать свой внешний адрес для связи через Интернет, я получаю следующую ошибку в классе TcpInformer.Connect():

попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или установленное соединение не удалось, потому что подключенный хост не ответил (мой внешний IP-адрес): (порт)

Я думал, что проблема в том, что я был за NAT. Но я уже настроил переадресацию портов 49731 на IP 10.0.0.1 и ничего не изменилось.

Моим вторым предположением был брандмауэр Windows, но даже когда я остановил брандмауэр, мое приложение не начало работать.

Мой код для подключения двух ПК:



        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 
    }


Есть ли способ, как проверить, что не так? Помощь очень ценится!


person Martin Vseticka    schedule 27.07.2009    source источник
comment
Я узнал, в чем была проблема. Я слушал 10.0.0.1 и пытался получить доступ к своему внешнему IP-адресу (второй экземпляр моей программы), что невозможно на компьютере с одним подключением к Интернету. Мне удалить этот пост?   -  person Martin Vseticka    schedule 29.07.2009
comment
Добавьте свой собственный ответ, объясняющий решение, и отметьте его как принятый.   -  person Richard    schedule 01.08.2009
comment
оставить этот пост. Это было полезно для меня.   -  person Panduranga Rao Sadhu    schedule 15.10.2014


Ответы (2)


Я узнал, в чем была проблема. Я слушал 10.0.0.1 и пытался получить доступ к своему внешнему IP-адресу (второй экземпляр моей программы), что невозможно на компьютере с одним подключением к Интернету.

person Martin Vseticka    schedule 23.08.2009

Я также столкнулся с той же проблемой в AWS VPN.

Я изменил proxy.company.com (внешний IP) на 10.0.0.5.

И это работает сейчас.

person Xin    schedule 13.04.2016