mirror of
https://github.com/islehorse/HISP.git
synced 2025-04-06 21:25:42 +12:00
Add timeout, fix keep-alive handling;
This commit is contained in:
parent
9944ead90e
commit
947a23f613
2 changed files with 36 additions and 25 deletions
|
@ -41,15 +41,17 @@ namespace HISP.Server
|
|||
}
|
||||
}
|
||||
public User LoggedinUser;
|
||||
|
||||
private Timer inactivityTimer;
|
||||
|
||||
private Timer keepAliveTimer;
|
||||
private Timer timeoutTimer;
|
||||
|
||||
private Timer warnTimer;
|
||||
private Timer kickTimer;
|
||||
private Timer minuteTimer;
|
||||
|
||||
private bool isDisconnecting = false;
|
||||
private int keepAliveInterval = 60 * 1000;
|
||||
|
||||
private int timeoutInterval = 95 * 1000;
|
||||
|
||||
private int totalMinutesElapsed = 0;
|
||||
private int oneMinute = 60 * 1000;
|
||||
|
@ -61,6 +63,9 @@ namespace HISP.Server
|
|||
|
||||
public GameClient(Socket clientSocket)
|
||||
{
|
||||
clientSocket.SendTimeout = 10 * 1000; // 10sec
|
||||
clientSocket.ReceiveTimeout = 10 * 1000; // 10sec
|
||||
|
||||
ClientSocket = clientSocket;
|
||||
RemoteIp = clientSocket.RemoteEndPoint.ToString();
|
||||
|
||||
|
@ -92,6 +97,13 @@ namespace HISP.Server
|
|||
e.AcceptSocket = null;
|
||||
} while (!GameServer.ServerSocket.AcceptAsync(e));
|
||||
}
|
||||
private void timeoutTimerTick(object state)
|
||||
{
|
||||
if (this.LoggedIn)
|
||||
{
|
||||
Disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
public void Disconnect()
|
||||
{
|
||||
|
@ -100,8 +112,8 @@ namespace HISP.Server
|
|||
this.isDisconnecting = true;
|
||||
|
||||
// Stop Timers
|
||||
if (inactivityTimer != null)
|
||||
inactivityTimer.Dispose();
|
||||
if (timeoutTimer != null)
|
||||
timeoutTimer.Dispose();
|
||||
if (warnTimer != null)
|
||||
warnTimer.Dispose();
|
||||
if (kickTimer != null)
|
||||
|
@ -159,12 +171,20 @@ namespace HISP.Server
|
|||
|
||||
}
|
||||
|
||||
|
||||
private void keepAliveTick(object state)
|
||||
{
|
||||
Logger.DebugPrint("Sending keep-alive packet to " + LoggedinUser.Username);
|
||||
byte[] updatePacket = PacketBuilder.CreateKeepAlive();
|
||||
SendPacket(updatePacket);
|
||||
keepAliveTimer.Change(oneMinute, oneMinute);
|
||||
}
|
||||
private void minuteTimerTick(object state)
|
||||
{
|
||||
totalMinutesElapsed++;
|
||||
if (LoggedIn)
|
||||
{
|
||||
GameServer.UpdatePlayer(this);
|
||||
|
||||
LoggedinUser.CanUseAdsChat = true;
|
||||
LoggedinUser.FreeMinutes -= 1;
|
||||
|
||||
|
@ -322,12 +342,7 @@ namespace HISP.Server
|
|||
|
||||
if (!isDisconnecting)
|
||||
minuteTimer.Change(oneMinute, oneMinute);
|
||||
}
|
||||
private void keepAliveTimerTick(object state)
|
||||
{
|
||||
Logger.DebugPrint("Sending keep-alive packet to "+ LoggedinUser.Username);
|
||||
byte[] updatePacket = PacketBuilder.CreateKeepAlive();
|
||||
SendPacket(updatePacket);
|
||||
|
||||
}
|
||||
|
||||
private void warnTimerTick(object state)
|
||||
|
@ -361,7 +376,8 @@ namespace HISP.Server
|
|||
Database.SetIpAddress(id, RemoteIp);
|
||||
Database.SetLoginCount(id, Database.GetLoginCount(id) + 1);
|
||||
|
||||
inactivityTimer = new Timer(new TimerCallback(keepAliveTimerTick), null, keepAliveInterval, keepAliveInterval);
|
||||
keepAliveTimer = new Timer(new TimerCallback(keepAliveTick), null, oneMinute, oneMinute);
|
||||
timeoutTimer = new Timer(new TimerCallback(timeoutTimerTick), null, timeoutInterval, timeoutInterval);
|
||||
}
|
||||
|
||||
private void parsePackets(byte[] Packet)
|
||||
|
@ -372,14 +388,14 @@ namespace HISP.Server
|
|||
}
|
||||
byte identifier = Packet[0];
|
||||
|
||||
// Reset timers
|
||||
|
||||
if (timeoutTimer != null)
|
||||
timeoutTimer.Change(timeoutInterval, timeoutInterval); // Reset time before timing out
|
||||
|
||||
if (inactivityTimer != null && identifier != PacketBuilder.PACKET_KEEP_ALIVE)
|
||||
if (keepAliveTimer != null && identifier != PacketBuilder.PACKET_KEEP_ALIVE)
|
||||
{
|
||||
if (LoggedIn)
|
||||
LoggedinUser.Idle = false;
|
||||
inactivityTimer.Change(keepAliveInterval, keepAliveInterval);
|
||||
keepAliveTimer.Change(oneMinute, oneMinute);
|
||||
}
|
||||
|
||||
if (kickTimer != null && identifier != PacketBuilder.PACKET_KEEP_ALIVE)
|
||||
|
|
|
@ -4387,11 +4387,6 @@ namespace HISP.Server
|
|||
}
|
||||
public static void OnKeepAlive(GameClient sender, byte[] packet)
|
||||
{
|
||||
if (!sender.LoggedIn)
|
||||
{
|
||||
Logger.ErrorPrint(sender.RemoteIp + " Requested update when not logged in.");
|
||||
return;
|
||||
}
|
||||
if (packet.Length < 2)
|
||||
{
|
||||
Logger.ErrorPrint(sender.LoggedinUser.Username + " Sent an invalid update Packet");
|
||||
|
@ -4400,8 +4395,8 @@ namespace HISP.Server
|
|||
|
||||
if (packet[1] == PacketBuilder.PACKET_CLIENT_TERMINATOR)
|
||||
{
|
||||
Logger.DebugPrint("Sending " + sender.LoggedinUser.Username + " updated info...");
|
||||
UpdatePlayer(sender);
|
||||
Logger.DebugPrint("Received KEEP_ALIVE from: " + sender.LoggedinUser.Username);
|
||||
return;
|
||||
}
|
||||
}
|
||||
public static void OnStatsPacket(GameClient sender, byte[] packet)
|
||||
|
@ -5828,7 +5823,7 @@ namespace HISP.Server
|
|||
if (message == "") // this is how pinto does it, im serious.
|
||||
{
|
||||
channel = Chat.ChatChannel.Dm;
|
||||
nameTo = channelString.Substring(1);
|
||||
nameTo = "";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue