mirror of
https://github.com/project-redbud/FunGame-Server.git
synced 2025-05-06 09:39:34 +08:00
添加拒绝连接和验证Token
This commit is contained in:
parent
062c0b026c
commit
5e0aa6a4af
@ -62,7 +62,7 @@ void StartServer()
|
|||||||
if (!INIHelper.ExistINIFile())
|
if (!INIHelper.ExistINIFile())
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine("未检测到配置文件,将自动创建配置文件 . . .");
|
ServerHelper.WriteLine("未检测到配置文件,将自动创建配置文件 . . .");
|
||||||
INIHelper.Init((FunGameInfo.FunGame)Config.FunGameType);
|
INIHelper.Init(Config.FunGameType);
|
||||||
ServerHelper.WriteLine("配置文件FunGame.ini创建成功,请修改该配置文件,然后重启服务器。");
|
ServerHelper.WriteLine("配置文件FunGame.ini创建成功,请修改该配置文件,然后重启服务器。");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -98,10 +98,25 @@ void StartServer()
|
|||||||
string ClientIPAddress = "";
|
string ClientIPAddress = "";
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
socket = ListeningSocket.Accept();
|
Guid Token = Guid.NewGuid();
|
||||||
|
socket = ListeningSocket.Accept(Token);
|
||||||
ClientIPAddress = socket.ClientIP;
|
ClientIPAddress = socket.ClientIP;
|
||||||
|
if (Config.ConnectingPlayersCount + Config.OnlinePlayersCount + 1 > Config.MaxPlayers)
|
||||||
|
{
|
||||||
|
SendRefuseConnect(socket, "服务器可接受的连接数量已上限!");
|
||||||
|
ServerHelper.WriteLine("服务器可接受的连接数量已上限!");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Config.ConnectingPlayersCount++;
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientIPAddress) + " 正在连接服务器 . . .");
|
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);
|
ServerModel ClientModel = new(ListeningSocket, socket, Running);
|
||||||
Task t = Task.Factory.StartNew(() =>
|
Task t = Task.Factory.StartNew(() =>
|
||||||
@ -109,13 +124,14 @@ void StartServer()
|
|||||||
ClientModel.Start();
|
ClientModel.Start();
|
||||||
});
|
});
|
||||||
ClientModel.SetTaskAndClientName(t, ClientIPAddress);
|
ClientModel.SetTaskAndClientName(t, ClientIPAddress);
|
||||||
if (!Config.OnlineClients.ContainsKey(ClientIPAddress)) Config.OnlineClients.Add(ClientIPAddress, ClientIPAddress);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientIPAddress) + " 连接失败。");
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientIPAddress) + " 连接失败。");
|
||||||
|
Config.ConnectingPlayersCount--;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
if (--Config.ConnectingPlayersCount < 0) Config.ConnectingPlayersCount = 0;
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientIPAddress) + " 断开连接!");
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientIPAddress) + " 断开连接!");
|
||||||
ServerHelper.Error(e);
|
ServerHelper.Error(e);
|
||||||
}
|
}
|
||||||
@ -148,7 +164,6 @@ void StartServer()
|
|||||||
bool Read(ClientSocket socket)
|
bool Read(ClientSocket socket)
|
||||||
{
|
{
|
||||||
// 接收客户端消息
|
// 接收客户端消息
|
||||||
byte[] buffer = new byte[General.SocketByteSize];
|
|
||||||
SocketObject read = socket.Receive();
|
SocketObject read = socket.Receive();
|
||||||
SocketMessageType type = read.SocketType;
|
SocketMessageType type = read.SocketType;
|
||||||
object[] objs = read.Parameters;
|
object[] objs = read.Parameters;
|
||||||
@ -164,13 +179,11 @@ bool Read(ClientSocket socket)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Send(ClientSocket socket)
|
bool Send(ClientSocket socket, Guid Token)
|
||||||
{
|
{
|
||||||
// 发送消息给客户端
|
// 发送消息给客户端
|
||||||
string msg = Config.ServerName + ";" + Config.ServerNotice;
|
string msg = Config.ServerName + ";" + Config.ServerNotice;
|
||||||
byte[] buffer = new byte[2048];
|
if (socket.Send(SocketMessageType.Connect, msg, Token) == SocketResult.Success)
|
||||||
buffer = Config.DefaultEncoding.GetBytes($"1;{msg}");
|
|
||||||
if (socket.Send(SocketMessageType.Connect, msg, Guid.NewGuid()) == SocketResult.Success)
|
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(socket.ClientIP) + " <- " + "已确认连接");
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(socket.ClientIP) + " <- " + "已确认连接");
|
||||||
return true;
|
return true;
|
||||||
@ -180,6 +193,20 @@ bool Send(ClientSocket socket)
|
|||||||
return false;
|
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()
|
SQLResult TestSQLConnection()
|
||||||
{
|
{
|
||||||
new MySQLHelper(ServerLoginLogs.Insert_ServerLoginLogs(Config.ServerName, Config.ServerKey)).Execute(out SQLResult TestResult);
|
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 Task? _Task = null;
|
||||||
private string _ClientName = "";
|
private string _ClientName = "";
|
||||||
|
|
||||||
|
private Guid Token = Guid.Empty;
|
||||||
private Guid CheckLoginKey = Guid.Empty;
|
private Guid CheckLoginKey = Guid.Empty;
|
||||||
private string RegVerify = "";
|
private string RegVerify = "";
|
||||||
private int FailedTimes = 0; // 超过一定次数断开连接
|
private int FailedTimes = 0; // 超过一定次数断开连接
|
||||||
@ -47,8 +48,11 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
Server = server;
|
Server = server;
|
||||||
_Socket = socket;
|
_Socket = socket;
|
||||||
_Running = running;
|
_Running = running;
|
||||||
|
Token = socket.Token;
|
||||||
SQLHelper = new(this);
|
SQLHelper = new(this);
|
||||||
MailSender = SmtpHelper.GetMailSender();
|
MailSender = SmtpHelper.GetMailSender();
|
||||||
|
Config.OnlinePlayersCount++;
|
||||||
|
GetUsersCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Read(ClientSocket socket)
|
public override bool Read(ClientSocket socket)
|
||||||
@ -62,6 +66,13 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
object[] args = SocketObject.Parameters;
|
object[] args = SocketObject.Parameters;
|
||||||
string msg = "";
|
string msg = "";
|
||||||
|
|
||||||
|
// 验证Token
|
||||||
|
if (token != Token)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 使用了非法方式传输消息,服务器拒绝回应 -> [" + ServerSocket.GetTypeString(type) + "] ");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// 如果不等于这些Type,就不会输出一行记录。这些Type有特定的输出。
|
// 如果不等于这些Type,就不会输出一行记录。这些Type有特定的输出。
|
||||||
SocketMessageType[] IgnoreType = new SocketMessageType[] { SocketMessageType.HeartBeat, SocketMessageType.Login, SocketMessageType.IntoRoom,
|
SocketMessageType[] IgnoreType = new SocketMessageType[] { SocketMessageType.HeartBeat, SocketMessageType.Login, SocketMessageType.IntoRoom,
|
||||||
SocketMessageType.Chat};
|
SocketMessageType.Chat};
|
||||||
@ -148,7 +159,6 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
|
|
||||||
case SocketMessageType.Disconnect:
|
case SocketMessageType.Disconnect:
|
||||||
msg = "你已成功断开与服务器的连接: " + Config.ServerName + "。 ";
|
msg = "你已成功断开与服务器的连接: " + Config.ServerName + "。 ";
|
||||||
GetUsersCount();
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SocketMessageType.HeartBeat:
|
case SocketMessageType.HeartBeat:
|
||||||
@ -188,14 +198,14 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
SQLHelper.ExecuteDataSet(UserQuery.Select_DuplicateUsername(username), out SQLResult result);
|
SQLHelper.ExecuteDataSet(UserQuery.Select_DuplicateUsername(username), out SQLResult result);
|
||||||
if (result == SQLResult.Success)
|
if (result == SQLResult.Success)
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + $" 账号已被注册");
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 账号已被注册");
|
||||||
return Send(socket, type, RegInvokeType.DuplicateUserName);
|
return Send(socket, type, RegInvokeType.DuplicateUserName);
|
||||||
}
|
}
|
||||||
// 检查邮箱是否重复
|
// 检查邮箱是否重复
|
||||||
SQLHelper.ExecuteDataSet(UserQuery.Select_DuplicateEmail(email), out result);
|
SQLHelper.ExecuteDataSet(UserQuery.Select_DuplicateEmail(email), out result);
|
||||||
if (result == SQLResult.Success)
|
if (result == SQLResult.Success)
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + $" 邮箱已被注册");
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 邮箱已被注册");
|
||||||
return Send(socket, type, RegInvokeType.DuplicateEmail);
|
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]);
|
DateTime RegTime = (DateTime)(SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime]);
|
||||||
if ((DateTime.Now - RegTime).TotalMinutes >= 10)
|
if ((DateTime.Now - RegTime).TotalMinutes >= 10)
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + $" 验证码已过期");
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 验证码已过期");
|
||||||
msg = "此验证码已过期,请重新注册。";
|
msg = "此验证码已过期,请重新注册。";
|
||||||
return Send(socket, type, false, msg);
|
return Send(socket, type, false, msg);
|
||||||
}
|
}
|
||||||
@ -399,7 +409,8 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
|
|
||||||
private void GetUsersCount()
|
private void GetUsersCount()
|
||||||
{
|
{
|
||||||
ServerHelper.WriteLine("目前在线玩家数量: " + Server.UsersCount);
|
ServerHelper.WriteLine($"目前在线客户端数量: {Config.OnlinePlayersCount}");
|
||||||
|
ServerHelper.WriteLine($"目前在线玩家数量: {Server.UsersCount}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CreateStreamReader()
|
private void CreateStreamReader()
|
||||||
@ -417,7 +428,6 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
{
|
{
|
||||||
RemoveUser();
|
RemoveUser();
|
||||||
Close();
|
Close();
|
||||||
GetUsersCount();
|
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Error -> Too Many Faileds.");
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Error -> Too Many Faileds.");
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Close -> StreamReader is Closed.");
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Close -> StreamReader is Closed.");
|
||||||
break;
|
break;
|
||||||
@ -429,7 +439,6 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
{
|
{
|
||||||
RemoveUser();
|
RemoveUser();
|
||||||
Close();
|
Close();
|
||||||
GetUsersCount();
|
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Error -> Socket is Closed.");
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Error -> Socket is Closed.");
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Close -> StringStream is Closed.");
|
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Close -> StringStream is Closed.");
|
||||||
break;
|
break;
|
||||||
@ -446,6 +455,8 @@ namespace Milimoe.FunGame.Server.Model
|
|||||||
Socket?.Close();
|
Socket?.Close();
|
||||||
_Socket = null;
|
_Socket = null;
|
||||||
_Running = false;
|
_Running = false;
|
||||||
|
Config.OnlinePlayersCount--;
|
||||||
|
GetUsersCount();
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
@ -20,7 +20,7 @@ namespace Milimoe.FunGame.Server.Others
|
|||||||
public static Encoding DefaultEncoding { get; } = General.DefaultEncoding; // 默认传输字符集
|
public static Encoding DefaultEncoding { get; } = General.DefaultEncoding; // 默认传输字符集
|
||||||
public static FunGameInfo.FunGame FunGameType { get; } = FunGameInfo.FunGame.FunGame_Server;
|
public static FunGameInfo.FunGame FunGameType { get; } = FunGameInfo.FunGame.FunGame_Server;
|
||||||
public static Hashtable OrderList { get; } = new();
|
public static Hashtable OrderList { get; } = new();
|
||||||
public static Hashtable OnlineClients { get; } = new Hashtable();
|
public static Hashtable BannedList { get; } = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class OfficialEmail
|
public static class OfficialEmail
|
||||||
|
@ -7,5 +7,10 @@
|
|||||||
public const string Exit = "exit";
|
public const string Exit = "exit";
|
||||||
public const string Close = "close";
|
public const string Close = "close";
|
||||||
public const string Restart = "restart";
|
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