Почему мой tcp-клиент не может подключиться к моему серверу - PullRequest
0 голосов
/ 02 августа 2020

У меня проблемы с кодом c# tcp. Когда я запускаю сервер и клиент на одном компьютере, он прекрасно подключается. Но когда я запускаю клиент на другом P C или на телефоне, я получаю: Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через определенный период времени, или установленное соединение не удалось, потому что подключенный хост не ответил. .

Вот код сервера:

        private static void CreateServer()
        {
            TcpListener server = null;
            try
            {

                Int32 port = 13000;
                IPAddress localAddr = IPAddress.Parse("127.0.0.1");


                server = new TcpListener(localAddr, port);

                server.Start();


                Byte[] bytes = new Byte[256];
                String data = null;

                while (true)
                {
                    Console.Write("Waiting for a connection... ");
                    /*
                    IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
                    var ipAddress = ipHostInfo.AddressList;
                    Console.WriteLine(ipHostInfo.HostName);
                    Console.WriteLine(ipAddress[0]);
                    */


                    TcpClient client = server.AcceptTcpClient();
                    Console.WriteLine("Connected!");

                    data = null;


                    NetworkStream stream = client.GetStream();

                    int i;


                    try
                    {
                        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                        {

                            data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
                            Console.WriteLine("Received: {0}", data);


                            data = data.ToUpper();

                            byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);


                            stream.Write(msg, 0, msg.Length);

                        }
                    }
                    catch(IOException e)
                    {
                        //Console.WriteLine(e);
                        Console.WriteLine("Restarting Server");
                        //client.Close();
                        //CreateServer();
                    }

                    // Shutdown and end connection
                    client.Close();
                }
            }
            catch (SocketException e)
            {
                //Console.WriteLine("SocketException: {0}", e);
            }
            finally
            {
                // Stop listening for new clients.
                server.Stop();
            }

            Console.WriteLine("\nHit enter to continue...");
            Console.Read();
        }

Я удалил большинство комментариев. Но это базовый c пример для tcp-сервера из документации.

код подключения клиента очень прост:

            tcpClient = new TcpClient();
            tcpClient.Connect("192.168.0.7", 13000);

с объявлением tcpClient, сохраненным в менее локальном место для сохранения и быстрого переподключения.

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

Я обнаружил проблему, и единственный человек, у которого возникла эта проблема, должен был убедиться, что он ввел правильный IP-адрес и исправил настройки своего брандмауэра. Возможно, мне не хватает чего-то очень очевидного.

И последнее, одно устройство подключено к маршрутизатору, я не знаю, с чем это связано.

Еще кое-что. , Я тоже пробовал:

tcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.7"), 13000));

.

1 Ответ

0 голосов
/ 02 августа 2020

Дракончик Я был прав. Это было что-то очень очевидное и, честно говоря, глупое с моей стороны.

на стороне сервера:

IPAddress localAddr = IPAddress.Parse("127.0.0.1");

не приводит к тому, что сервер слушает свой ipv4, вместо этого он слушает ipv6, поэтому что вы хотите: удалите объявление localAddr, так как это не важно, и вместо вызова:

server = new TcpListener(localAddr, port);

call:

server = new TcpListener(IPAddress.Any, port);

IPAddress.Any используется для прослушивания всех сетевые интерфейсы устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...