为什么我的TCP客户端无法连接到服务器

时间:2020-08-01 22:49:40

标签: c# tcp local-network

我在使用c#tcp代码时遇到麻烦。 当我在同一台计算机上运行服务器和客户端时,它将正常连接。 但是,当我在另一台PC或电话上运行客户端时,我得到:连接尝试失败,因为一段时间后连接方未正确响应,或者由于连接的主机未能响应而建立连接失败。

这是服务器代码:

        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();
        }

我删除了大部分评论。但这是文档中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 :(得分:0)

我是对的。这对我来说是非常明显和愚蠢的。

在服务器端:

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

不会导致服务器在其ipv4上进行监听,而是在ipv6上进行监听 所以你想要什么: 删除localAddr声明(因为它并不重要),而不是调用:

server = new TcpListener(localAddr, port);

致电:

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

IPAddress。Any用于侦听设备具有的所有网络接口。