From 5e0aa6a4af8d80aed0a49d41c7e0aedbfb33755c Mon Sep 17 00:00:00 2001 From: Mili Date: Sat, 11 Mar 2023 19:08:17 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8B=92=E7=BB=9D=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E5=92=8C=E9=AA=8C=E8=AF=81Token?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FunGame.Server/Main.cs | 45 +++++++++++++++++++----- FunGame.Server/Model/ServerModel.cs | 25 +++++++++---- FunGame.Server/Others/Config.cs | 2 +- FunGame.Server/Others/OrderDictionary.cs | 5 +++ 4 files changed, 60 insertions(+), 17 deletions(-) diff --git a/FunGame.Server/Main.cs b/FunGame.Server/Main.cs index 1f85ebf..5879a4c 100644 --- a/FunGame.Server/Main.cs +++ b/FunGame.Server/Main.cs @@ -62,7 +62,7 @@ void StartServer() if (!INIHelper.ExistINIFile()) { ServerHelper.WriteLine("未检测到配置文件,将自动创建配置文件 . . ."); - INIHelper.Init((FunGameInfo.FunGame)Config.FunGameType); + INIHelper.Init(Config.FunGameType); ServerHelper.WriteLine("配置文件FunGame.ini创建成功,请修改该配置文件,然后重启服务器。"); return; } @@ -98,10 +98,25 @@ void StartServer() string ClientIPAddress = ""; try { - socket = ListeningSocket.Accept(); + Guid Token = Guid.NewGuid(); + socket = ListeningSocket.Accept(Token); ClientIPAddress = socket.ClientIP; + if (Config.ConnectingPlayersCount + Config.OnlinePlayersCount + 1 > Config.MaxPlayers) + { + SendRefuseConnect(socket, "服务器可接受的连接数量已上限!"); + ServerHelper.WriteLine("服务器可接受的连接数量已上限!"); + continue; + } + Config.ConnectingPlayersCount++; ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientIPAddress) + " 正在连接服务器 . . ."); - if (Read(socket) && Send(socket)) + if (Config.BannedList.ContainsKey(ClientIPAddress)) + { + SendRefuseConnect(socket, "服务器已拒绝黑名单用户连接。"); + ServerHelper.WriteLine("检测到 " + SocketHelper.MakeClientName(ClientIPAddress) + " 为黑名单用户,已禁止其连接!"); + Config.ConnectingPlayersCount--; + continue; + } + if (Read(socket) && Send(socket, Token)) { ServerModel ClientModel = new(ListeningSocket, socket, Running); Task t = Task.Factory.StartNew(() => @@ -109,13 +124,14 @@ void StartServer() ClientModel.Start(); }); ClientModel.SetTaskAndClientName(t, ClientIPAddress); - if (!Config.OnlineClients.ContainsKey(ClientIPAddress)) Config.OnlineClients.Add(ClientIPAddress, ClientIPAddress); } else ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientIPAddress) + " 连接失败。"); + Config.ConnectingPlayersCount--; } catch (Exception e) { + if (--Config.ConnectingPlayersCount < 0) Config.ConnectingPlayersCount = 0; ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientIPAddress) + " 断开连接!"); ServerHelper.Error(e); } @@ -148,7 +164,6 @@ void StartServer() bool Read(ClientSocket socket) { // 接收客户端消息 - byte[] buffer = new byte[General.SocketByteSize]; SocketObject read = socket.Receive(); SocketMessageType type = read.SocketType; object[] objs = read.Parameters; @@ -164,13 +179,11 @@ bool Read(ClientSocket socket) return false; } -bool Send(ClientSocket socket) +bool Send(ClientSocket socket, Guid Token) { // 发送消息给客户端 string msg = Config.ServerName + ";" + Config.ServerNotice; - byte[] buffer = new byte[2048]; - buffer = Config.DefaultEncoding.GetBytes($"1;{msg}"); - if (socket.Send(SocketMessageType.Connect, msg, Guid.NewGuid()) == SocketResult.Success) + if (socket.Send(SocketMessageType.Connect, msg, Token) == SocketResult.Success) { ServerHelper.WriteLine(SocketHelper.MakeClientName(socket.ClientIP) + " <- " + "已确认连接"); return true; @@ -180,6 +193,20 @@ bool Send(ClientSocket socket) return false; } +bool SendRefuseConnect(ClientSocket socket, string msg) +{ + // 发送消息给客户端 + msg = $"连接被拒绝,如有疑问请联系服务器管理员:{msg}"; + if (socket.Send(SocketMessageType.Connect, msg) == SocketResult.Success) + { + ServerHelper.WriteLine(SocketHelper.MakeClientName(socket.ClientIP) + " <- " + "已拒绝连接"); + return true; + } + else + ServerHelper.WriteLine("无法传输数据,与客户端的连接可能丢失。"); + return false; +} + SQLResult TestSQLConnection() { new MySQLHelper(ServerLoginLogs.Insert_ServerLoginLogs(Config.ServerName, Config.ServerKey)).Execute(out SQLResult TestResult); diff --git a/FunGame.Server/Model/ServerModel.cs b/FunGame.Server/Model/ServerModel.cs index 01a752d..8a3365c 100644 --- a/FunGame.Server/Model/ServerModel.cs +++ b/FunGame.Server/Model/ServerModel.cs @@ -32,6 +32,7 @@ namespace Milimoe.FunGame.Server.Model private Task? _Task = null; private string _ClientName = ""; + private Guid Token = Guid.Empty; private Guid CheckLoginKey = Guid.Empty; private string RegVerify = ""; private int FailedTimes = 0; // 超过一定次数断开连接 @@ -47,8 +48,11 @@ namespace Milimoe.FunGame.Server.Model Server = server; _Socket = socket; _Running = running; + Token = socket.Token; SQLHelper = new(this); MailSender = SmtpHelper.GetMailSender(); + Config.OnlinePlayersCount++; + GetUsersCount(); } public override bool Read(ClientSocket socket) @@ -62,6 +66,13 @@ namespace Milimoe.FunGame.Server.Model object[] args = SocketObject.Parameters; string msg = ""; + // 验证Token + if (token != Token) + { + ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 使用了非法方式传输消息,服务器拒绝回应 -> [" + ServerSocket.GetTypeString(type) + "] "); + return false; + } + // 如果不等于这些Type,就不会输出一行记录。这些Type有特定的输出。 SocketMessageType[] IgnoreType = new SocketMessageType[] { SocketMessageType.HeartBeat, SocketMessageType.Login, SocketMessageType.IntoRoom, SocketMessageType.Chat}; @@ -148,7 +159,6 @@ namespace Milimoe.FunGame.Server.Model case SocketMessageType.Disconnect: msg = "你已成功断开与服务器的连接: " + Config.ServerName + "。 "; - GetUsersCount(); break; case SocketMessageType.HeartBeat: @@ -188,14 +198,14 @@ namespace Milimoe.FunGame.Server.Model SQLHelper.ExecuteDataSet(UserQuery.Select_DuplicateUsername(username), out SQLResult result); if (result == SQLResult.Success) { - ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + $" 账号已被注册"); + ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 账号已被注册"); return Send(socket, type, RegInvokeType.DuplicateUserName); } // 检查邮箱是否重复 SQLHelper.ExecuteDataSet(UserQuery.Select_DuplicateEmail(email), out result); if (result == SQLResult.Success) { - ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + $" 邮箱已被注册"); + ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 邮箱已被注册"); return Send(socket, type, RegInvokeType.DuplicateEmail); } // 检查验证码是否发送过 @@ -261,7 +271,7 @@ namespace Milimoe.FunGame.Server.Model DateTime RegTime = (DateTime)(SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime]); if ((DateTime.Now - RegTime).TotalMinutes >= 10) { - ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + $" 验证码已过期"); + ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 验证码已过期"); msg = "此验证码已过期,请重新注册。"; return Send(socket, type, false, msg); } @@ -399,7 +409,8 @@ namespace Milimoe.FunGame.Server.Model private void GetUsersCount() { - ServerHelper.WriteLine("目前在线玩家数量: " + Server.UsersCount); + ServerHelper.WriteLine($"目前在线客户端数量: {Config.OnlinePlayersCount}"); + ServerHelper.WriteLine($"目前在线玩家数量: {Server.UsersCount}"); } private void CreateStreamReader() @@ -417,7 +428,6 @@ namespace Milimoe.FunGame.Server.Model { RemoveUser(); Close(); - GetUsersCount(); ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Error -> Too Many Faileds."); ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Close -> StreamReader is Closed."); break; @@ -429,7 +439,6 @@ namespace Milimoe.FunGame.Server.Model { RemoveUser(); Close(); - GetUsersCount(); ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Error -> Socket is Closed."); ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Close -> StringStream is Closed."); break; @@ -446,6 +455,8 @@ namespace Milimoe.FunGame.Server.Model Socket?.Close(); _Socket = null; _Running = false; + Config.OnlinePlayersCount--; + GetUsersCount(); } catch (Exception e) { diff --git a/FunGame.Server/Others/Config.cs b/FunGame.Server/Others/Config.cs index 5147e9b..8d62781 100644 --- a/FunGame.Server/Others/Config.cs +++ b/FunGame.Server/Others/Config.cs @@ -20,7 +20,7 @@ namespace Milimoe.FunGame.Server.Others public static Encoding DefaultEncoding { get; } = General.DefaultEncoding; // 默认传输字符集 public static FunGameInfo.FunGame FunGameType { get; } = FunGameInfo.FunGame.FunGame_Server; public static Hashtable OrderList { get; } = new(); - public static Hashtable OnlineClients { get; } = new Hashtable(); + public static Hashtable BannedList { get; } = new(); } public static class OfficialEmail diff --git a/FunGame.Server/Others/OrderDictionary.cs b/FunGame.Server/Others/OrderDictionary.cs index 02b2883..9a6384f 100644 --- a/FunGame.Server/Others/OrderDictionary.cs +++ b/FunGame.Server/Others/OrderDictionary.cs @@ -7,5 +7,10 @@ public const string Exit = "exit"; public const string Close = "close"; public const string Restart = "restart"; + public const string AddBanned1 = "ban -add"; + public const string AddBanned2 = "ban -a"; + public const string RemoveBanned1 = "ban -remove"; + public const string RemoveBanned2 = "ban -r"; + public const string Kick = "kick"; } }