添加拒绝连接和验证Token

This commit is contained in:
Mili 2023-03-11 19:08:17 +08:00
parent 062c0b026c
commit 5e0aa6a4af
4 changed files with 60 additions and 17 deletions

View File

@ -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);

View File

@ -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)
{

View File

@ -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

View File

@ -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";
}
}