From b9aacb530bc9acc538cd59f3a1c0cdbf63896aa1 Mon Sep 17 00:00:00 2001 From: teascade Date: Sat, 25 Nov 2017 16:23:55 +0200 Subject: [PATCH] Add disconnect by timeout --- scripts/net/ConnectionList.cs | 8 ++++++++ scripts/net/Peer.cs | 23 ++++++++++++++++++++++- scripts/net/syncing/ConnectionHandler.cs | 10 ++++++++++ scripts/net/syncing/PacketDistributor.cs | 11 +++++++++++ scripts/util/DisconnectReason.cs | 6 ++++++ 5 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 scripts/util/DisconnectReason.cs diff --git a/scripts/net/ConnectionList.cs b/scripts/net/ConnectionList.cs index c40c522..d786bdb 100644 --- a/scripts/net/ConnectionList.cs +++ b/scripts/net/ConnectionList.cs @@ -28,6 +28,14 @@ namespace Network { return false; } + public bool RemoveConnection(Connection conn) { + if (Contains(conn)) { + Connections.Remove(conn); + return true; + } + return false; + } + public bool Contains(Connection conn) { for (int i = 0; i < Connections.Count; i++) { Connection inList = Connections[i]; diff --git a/scripts/net/Peer.cs b/scripts/net/Peer.cs index d71e80e..d343c71 100644 --- a/scripts/net/Peer.cs +++ b/scripts/net/Peer.cs @@ -8,6 +8,8 @@ using Thread = System.Threading.Thread; namespace Network { public abstract class Peer : Object { + public const float TIMEOUT = 4f; // 4 seconds + private static PacketPeerUDP PacketPeer; private static Peer Singleton; public readonly bool IsServer; @@ -26,7 +28,7 @@ namespace Network { IsServer = isServer; Protocol = new Protocol(this); ConnectionList = new ConnectionList(this); - PacketDistributor = new PacketDistributor(this, 2); + PacketDistributor = new PacketDistributor(this, 0.5f); } public void Update(float delta) { @@ -37,6 +39,7 @@ namespace Network { public abstract void Initialize(string address, int port); public abstract void Process(float delta); public abstract void Connected(Connection conn); + public abstract void Disconnected(Connection conn); public void SendBuffer(PacketBuffer packetBuffer, Connection to) { if (LastConnectionSended != to.ID) { @@ -44,6 +47,7 @@ namespace Network { LastConnectionSended = to.ID; } PacketPeer.PutPacket(packetBuffer.ByteBuffer); + GD.print("Sent PacketBuffer with size " + packetBuffer.ByteBuffer.Length + " bytes."); } public bool StartListening(int port, string address = "*") { @@ -93,5 +97,22 @@ namespace Network { } } } + + public void Disconnect(Connection conn, DisconnectReason reason) { + GD.print(conn + " disconnected. Reason:"); + switch (reason) { + case DisconnectReason.TIMEOUT: { + GD.print("TIMEOUT"); + break; + } + default: { + GD.print("Unknown."); + break; + } + } + + ConnectionList.RemoveConnection(conn); + PacketDistributor.RemoveHandler(conn); + } } } \ No newline at end of file diff --git a/scripts/net/syncing/ConnectionHandler.cs b/scripts/net/syncing/ConnectionHandler.cs index cde331a..f215705 100644 --- a/scripts/net/syncing/ConnectionHandler.cs +++ b/scripts/net/syncing/ConnectionHandler.cs @@ -3,6 +3,7 @@ using Godot; using Network.PacketHandling; using Network.PacketHandling.Packets; using System.Collections.Generic; +using Util; namespace Network.Syncing { public class ConnectionHandler { @@ -26,6 +27,13 @@ namespace Network.Syncing { Connection = connection; } + public void Update(float delta) { + TimeSinceLastPacket += delta; + if (TimeSinceLastPacket > Peer.TIMEOUT) { + Peer.Disconnect(Connection, DisconnectReason.TIMEOUT); + } + } + public void SerializeAndSendQueues(int UnreliableSyncID) { PacketBuffer Buffer = PacketBuffer.WithSignature(); @@ -59,6 +67,8 @@ namespace Network.Syncing { } public void ReceiveBuffer(PacketBuffer packetBuffer) { + TimeSinceLastPacket = 0; + SyncPkt Sync = new SyncPkt(); Sync.Deserialize(packetBuffer); diff --git a/scripts/net/syncing/PacketDistributor.cs b/scripts/net/syncing/PacketDistributor.cs index 63076af..a8efa24 100644 --- a/scripts/net/syncing/PacketDistributor.cs +++ b/scripts/net/syncing/PacketDistributor.cs @@ -31,6 +31,10 @@ namespace Network.Syncing { Handler.SerializeAndSendQueues(UnreliableIDCounter++); } } + + foreach (ConnectionHandler Handler in HandlerList.ToArray()) { + Handler.Update(delta); + } } public void HandleRawPacket(PacketBuffer packetBuffer, Connection connection) { @@ -47,6 +51,13 @@ namespace Network.Syncing { HandlerList.Add(Handler); } + public void RemoveHandler(Connection connection) { + Optional Handler = GetHandlerFor(connection); + if (Handler.HasValue) { + HandlerList.Remove(Handler); + } + } + public void AddReliableFor(Connection connection, Serializable serializable) { var ConnHandlerOpt = GetHandlerFor(connection); if (ConnHandlerOpt.HasValue) { diff --git a/scripts/util/DisconnectReason.cs b/scripts/util/DisconnectReason.cs new file mode 100644 index 0000000..a9b9504 --- /dev/null +++ b/scripts/util/DisconnectReason.cs @@ -0,0 +1,6 @@ + +namespace Util { + public enum DisconnectReason { + TIMEOUT + } +}