gpt4 book ai didi

c# - .NET TCP 服务器断开连接

转载 作者:可可西里 更新时间:2023-11-01 02:37:42 27 4
gpt4 key购买 nike

前阵子我写了一个小应用程序来实现 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(!terminated) { .. },这将确保无论何时您的应用程序告诉程序结束或停止监听,循环也将终止,因为您将 terminated 设置为 true . while(true) 所说的是永远持续到 break 发生,然后它随后跳出 while 循环并调用 .Close().

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com