c# - .NET TCP 服务器删除连接

标签 c# .net tcp tcpserver

不久前,我编写了一个小应用程序来实现 TCP 服务器,但作为 C# .NET 的新手,我只是按照教程进行操作。授权部分工作正常,但由于严格遵循教程,授权完成后,它会断开与 tcpClient.Close() 的连接;

我应该如何调整此代码以继续监听更多数据包?我认为大多数服务器都会在 X 分钟后断开连接,但我对此类事情仍然很陌生。

// Starts the TCP RCON Server
public void StartServer()
{
    Console.WriteLine("RCON Server starting on Port: {0}", serverPort);

    this.tcpListener = new TcpListener(IPAddress.Any, serverPort);
    this.listenThread = new Thread(new ThreadStart(ListenForClients));
    this.listenThread.Start();

    Console.WriteLine("RCON Server has been Started.");
}

// Listen for Client Connections
private void ListenForClients()
{
    this.tcpListener.Start();

    while (true)
    {
        // blocks until a client has connected to the server
        TcpClient client = this.tcpListener.AcceptTcpClient();

        // Create a thread for client communication
        Thread clientThread = new Thread(new ParameterizedThreadStart(ReadClientPacket));
        clientThread.Start(client);
    }
}

private void ReadClientPacket(object client)
{
    TcpClient tcpClient = (TcpClient)client;
    NetworkStream clientStream = tcpClient.GetStream();

    bool terminate = false;

    while (!terminate)
    {
        try
        {
            int packetsize;

            // Create a new Packet Object and fill out the data from the incoming TCP Packets
            RCONPacket packet = new RCONPacket();

            using (BinaryReader reader = new BinaryReader(clientStream))
            {
                // First Int32 is Packet Size
                packetsize = reader.ReadInt32();

                packet.RequestId = reader.ReadInt32();
                packet.RconDataReceived = (RCONPacket.RCONDATA_rec)reader.ReadInt32();

                Console.WriteLine("Packet Size: {0} RequestID: {1} ServerData: {2}", packetsize, packet.RequestId, packet.RconDataReceived);

                // Read first and second String in the Packet (UTF8 Null Terminated)
                packet.String1 = ReadBytesString(reader);
                packet.String2 = ReadBytesString(reader);

                Console.WriteLine("String1: {0} String2: {1}", packet.String1, packet.String2);

                switch (packet.RconDataReceived)
                {
                    case RCONPacket.RCONDATA_rec.SERVERDATA_AUTH:
                    {
                        if (packet.String1 == "testpass")
                        {
                            Console.WriteLine("Password is Valid");
                            ReplyAuthRequest(packet.RequestId, tcpClient, packet.String1); // Junk Packet
                            ReplyAuthRequest(packet.RequestId, tcpClient, packet.String1);
                        }
                        else
                        {
                            Console.WriteLine("Password is Invalid");
                            ReplyAuthRequest(BAD_PASSWORD, tcpClient, packet.String1); // Junk Packet
                            ReplyAuthRequest(BAD_PASSWORD, tcpClient, packet.String1);

                            terminate = true;
                        }

                        break;
                    }
                    case RCONPacket.RCONDATA_rec.SERVERDATA_EXECCOMMAND:
                    {
                        Console.WriteLine("RCON Command Packet Received");
                        ReplyExecCommand(packet.RequestId, tcpClient);

                        break;
                    }
                    default:
                    {
                        break;
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            terminate = true;
        }
    }

    tcpClient.Close();
}

最佳答案

如果您注意到的话,您会发现有很多 break 语句。我不清楚你的程序的整个设计,但如果你删除这些,然后在 while 循环中添加对 boolean 值的检查,例如 while(!termerated) { .. },这将确保每当您的应用程序告诉程序结束或停止监听时,循环也将终止,因为您将 termination 设置为 true 。 while(true) 所说的是永远持续下去,直到发生 break,然后它会跳出 while 循环并调用 .Close().

关于c# - .NET TCP 服务器删除连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6439736/

相关文章:

c# - 在 Xamarin.Android 中隐藏标题栏

Java TCP 套接字 : data transfer is slow

c# - 与 Html.DropDownListFor 的错误值绑定(bind)

c# - Azure 构建 - 命名空间 'OpenApi' 中不存在类型或命名空间名称 'Microsoft'

c# - 使用 Linq to Entities 执行字符串搜索

.net - 仅在部署的PresentationFramework 中发生XmlParseException

c# - .NET 中的泛型方法无法推断其返回类型。为什么?

.net - 使用 C# .Net 的 TCP 客户端/服务器

c - 保留的 TCP/IP 端口

c# - SqlCommand.Prepare 方法要求所有参数都具有显式设置的类型