From 6598abf5047836b2582b8ddae468b002ff3953ff Mon Sep 17 00:00:00 2001 From: teascade Date: Mon, 10 Aug 2020 20:34:56 +0300 Subject: [PATCH] Add a traffic monitoring system to Peer --- Assets/Scripts/TeaNet/Packets/ByteBuffer.cs | 2 ++ Assets/Scripts/TeaNet/Peers/Connection.cs | 4 +--- .../Scripts/TeaNet/Peers/ConnectionManager.cs | 5 +++- Assets/Scripts/TeaNet/Peers/ListenerThread.cs | 4 ++++ Assets/Scripts/TeaNet/Peers/Peer.cs | 23 ++++++++++++++++++- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Assets/Scripts/TeaNet/Packets/ByteBuffer.cs b/Assets/Scripts/TeaNet/Packets/ByteBuffer.cs index 0f0628a..c8886e2 100644 --- a/Assets/Scripts/TeaNet/Packets/ByteBuffer.cs +++ b/Assets/Scripts/TeaNet/Packets/ByteBuffer.cs @@ -5,6 +5,8 @@ using System.Text; namespace NeonTea.Quakeball.TeaNet.Packets { /// Contains a stream of bytes for sending or receiving over the internet. public class ByteBuffer { + public int Size => Bytes.Count; + private List Bytes; private int pos = 0; diff --git a/Assets/Scripts/TeaNet/Peers/Connection.cs b/Assets/Scripts/TeaNet/Peers/Connection.cs index da3a60a..a94b787 100644 --- a/Assets/Scripts/TeaNet/Peers/Connection.cs +++ b/Assets/Scripts/TeaNet/Peers/Connection.cs @@ -1,6 +1,4 @@ -using System.Collections; -using System.Collections.Generic; -using System.Net; +using System.Net; using System; using NeonTea.Quakeball.TeaNet.Packets; diff --git a/Assets/Scripts/TeaNet/Peers/ConnectionManager.cs b/Assets/Scripts/TeaNet/Peers/ConnectionManager.cs index c304e79..a99a6dd 100644 --- a/Assets/Scripts/TeaNet/Peers/ConnectionManager.cs +++ b/Assets/Scripts/TeaNet/Peers/ConnectionManager.cs @@ -1,4 +1,3 @@ -using UnityEngine; using System.Collections.Generic; using System.Net; using System.Threading; @@ -22,6 +21,9 @@ namespace NeonTea.Quakeball.TeaNet.Peers { public long Timeout = 8000; public long Interval = 100; + /// The amount of bytes sent since the last clear interval from Peer + public int BytesSent; + public ConnectionManager(Peer peer) { Peer = peer; UpdateThread = new Thread(new ThreadStart(UpdateThreadMethod)); @@ -163,6 +165,7 @@ namespace NeonTea.Quakeball.TeaNet.Peers { if (conn.Status == ConnectionStatus.Lost) { return; } + BytesSent += buffer.Size; byte[] bytes = buffer.Pack(); Peer.ListenerThread.LastSentConnection = conn; Peer.UdpClient.Send(bytes, bytes.Length, conn.Endpoint); diff --git a/Assets/Scripts/TeaNet/Peers/ListenerThread.cs b/Assets/Scripts/TeaNet/Peers/ListenerThread.cs index d41f3df..b81ed3f 100644 --- a/Assets/Scripts/TeaNet/Peers/ListenerThread.cs +++ b/Assets/Scripts/TeaNet/Peers/ListenerThread.cs @@ -17,6 +17,9 @@ namespace NeonTea.Quakeball.TeaNet.Peers { private static int[] CONN_LOST_CODES = new int[] { 10054, 10051 }; + /// The amount of bytes received since the last clear interval from Peer + public int ReceivedBytes; + public ListenerThread(Peer peer, IPEndPoint endpoint) { EndPoint = endpoint; Peer = peer; @@ -61,6 +64,7 @@ namespace NeonTea.Quakeball.TeaNet.Peers { } if (Buffer.ReadFingerprint(Peer.Fingerprint)) { Peer.ConnectionManager.Handle(Listened, Buffer); + ReceivedBytes += Buffer.Size; } } } diff --git a/Assets/Scripts/TeaNet/Peers/Peer.cs b/Assets/Scripts/TeaNet/Peers/Peer.cs index ab454f6..7f1ef86 100644 --- a/Assets/Scripts/TeaNet/Peers/Peer.cs +++ b/Assets/Scripts/TeaNet/Peers/Peer.cs @@ -1,5 +1,4 @@ using System.Collections.Generic; -using UnityEngine; using System; using System.Net; using System.Net.Sockets; @@ -31,6 +30,12 @@ namespace NeonTea.Quakeball.TeaNet.Peers { ConnectionManager.Interval = value; } } + /// The interval of traffic analyzed before updating + public long TrafficDataInterval; + /// The amount of bytes received in the last TrafficDataIntervel + public int TrafficReceived { get; private set; } + /// The amount of bytes sent in the last TrafficDataIntervel + public int TrafficSent { get; private set; } /// Whether the Peer is currently doing anything or not.null public bool Running { get; private set; } @@ -41,11 +46,14 @@ namespace NeonTea.Quakeball.TeaNet.Peers { /// Listener for messages and errors from within the Peer. public PeerMessageListener MessageListener; + private long LastTrafficData; + /// Creates a new Peer with the given fingerprint. The fingerprint can be anything, it just must be same on both peers. public Peer(byte[] fingerprint) { Fingerprint = fingerprint; ConnectionManager = new ConnectionManager(this); MessageListener = this; + LastTrafficData = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); } /// Starts the UdpClient, but does no networking as is. @@ -150,6 +158,19 @@ namespace NeonTea.Quakeball.TeaNet.Peers { /// Shorthand for Peer.ConnectionManager.Update(): Handles network stuff that was received since last update. public void Update() { ConnectionManager.Update(); + + long now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + if (now - LastTrafficData > TrafficDataInterval) { + LastTrafficData = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + if (ListenerThread != null) { + TrafficReceived = ListenerThread.ReceivedBytes; + ListenerThread.ReceivedBytes = 0; + } + if (ConnectionManager != null) { + TrafficSent = ConnectionManager.BytesSent; + ConnectionManager.BytesSent = 0; + } + } } public void Message(string msg) { }