mirror of
https://github.com/project-redbud/FunGame-Server.git
synced 2025-04-22 20:19:35 +08:00
添加拒绝连接和验证Token
This commit is contained in:
parent
062c0b026c
commit
5e0aa6a4af
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user