NetSharp

NetSharp.git
git clone git://git.lenczewski.org/NetSharp.git
Log | Files | Refs | README | LICENSE

commit 2fcba23d00ae45d24469db135d99ba1ce47b3164
parent 9c793631ee741cdc79f1ecef66d00b906e94ad1b
Author: Mikolaj Lenczewski <mikolaj.lenczewski308@gmail.com>
Date:   Thu, 25 Jun 2020 23:49:14 +0100

Added combined benchmarks (using both the writer and reader), and moved all important constants into Program.Constants

Diffstat:
ANetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/CombinedMultiClientRawDatagramBenchmark.cs | 112+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ANetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/CombinedSingleClientRawDatagramBenchmark.cs | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MNetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkReaderMultiClientBenchmark.cs | 26+++++++++++++-------------
MNetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkReaderSingleClientBenchmark.cs | 20++++++++++----------
MNetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkWriterAsyncBenchmark.cs | 28++++++++++------------------
MNetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkWriterSyncBenchmark.cs | 20++++++++++----------
ANetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/CombinedMultiClientRawStreamBenchmark.cs | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ANetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/CombinedSingleClientRawStreamBenchmark.cs | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MNetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkReaderMultiClientBenchmark.cs | 39++++++++++++++++++++-------------------
MNetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkReaderSingleClientBenchmark.cs | 31++++++++++++++++---------------
MNetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkWriterAsyncBenchmark.cs | 30+++++++++++-------------------
MNetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkWriterSyncBenchmark.cs | 30+++++++++++-------------------
MNetSharp/NetSharp.Benchmarks/Program.cs | 2++
13 files changed, 550 insertions(+), 123 deletions(-)

diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/CombinedMultiClientRawDatagramBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/CombinedMultiClientRawDatagramBenchmark.cs @@ -0,0 +1,111 @@ +using System; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +using NetSharp.Raw.Datagram; + +namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks +{ + internal class CombinedMultiClientRawDatagramBenchmark : INetSharpBenchmark + { + private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); + private double[] ClientBandwidths; + + public string Name => "Combined Raw Datagram Network Reader/Writer (Multiple Clients) Benchmark"; + + private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer) + { + requestBuffer.CopyTo(responseBuffer); + + return true; + } + + private Task BenchmarkClientTask(object idObj) + { + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + + BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); + + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; + + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; + + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + rawSocket.Bind(Program.Constants.ClientEndPoint); + + using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); + + ServerReadyEvent.Wait(); + + benchmarkHelper.ResetStopwatch(); + + for (int i = 0; i < Program.Constants.PacketCount; i++) + { + byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); + packetBuffer.CopyTo(sendBuffer, 0); + + benchmarkHelper.StartStopwatch(); + int sendResult = writer.Write(Program.Constants.ServerEndPoint, sendBuffer); + + int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); + benchmarkHelper.StopStopwatch(); + + benchmarkHelper.SnapshotRttStats(); + } + + lock (typeof(Console)) + { + benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.PrintRttStats((int) idObj); + } + + ClientBandwidths[(int) idObj] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + + rawSocket.Close(); + rawSocket.Dispose(); + + return Task.CompletedTask; + } + + public async Task RunAsync() + { + if (Program.Constants.PacketCount > 10_000) + { + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + } + + ClientBandwidths = new double[Program.Constants.ClientCount]; + Task[] clientTasks = new Task[Program.Constants.ClientCount]; + for (int i = 0; i < clientTasks.Length; i++) + { + clientTasks[i] = Task.Factory.StartNew(BenchmarkClientTask, i, TaskCreationOptions.LongRunning); + } + + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + rawSocket.Bind(Program.Constants.ServerEndPoint); + + using RawDatagramNetworkReader reader = new RawDatagramNetworkReader(ref rawSocket, RequestHandler, defaultRemoteEndPoint, Program.Constants.PacketSize); + reader.Start(Program.Constants.ClientCount); + + ServerReadyEvent.Set(); + + await Task.WhenAll(clientTasks); + + Console.WriteLine($"Total estimated bandwidth: {ClientBandwidths.Sum():F3}"); + + reader.Shutdown(); + + rawSocket.Close(); + rawSocket.Dispose(); + } + } +} +\ No newline at end of file diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/CombinedSingleClientRawDatagramBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/CombinedSingleClientRawDatagramBenchmark.cs @@ -0,0 +1,107 @@ +using System; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +using NetSharp.Raw.Datagram; + +namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks +{ + internal class CombinedSingleClientRawDatagramBenchmark : INetSharpBenchmark + { + private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); + private double[] ClientBandwidths; + + public string Name => "Combined Raw Datagram Network Reader/Writer (Single Client) Benchmark"; + + private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer) + { + requestBuffer.CopyTo(responseBuffer); + + return true; + } + + private Task BenchmarkClientTask(object idObj) + { + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + + BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); + + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; + + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; + + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + rawSocket.Bind(Program.Constants.ClientEndPoint); + + using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); + + ServerReadyEvent.Wait(); + + benchmarkHelper.ResetStopwatch(); + + for (int i = 0; i < Program.Constants.PacketCount; i++) + { + byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); + packetBuffer.CopyTo(sendBuffer, 0); + + benchmarkHelper.StartStopwatch(); + int sendResult = writer.Write(Program.Constants.ServerEndPoint, sendBuffer); + + int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); + benchmarkHelper.StopStopwatch(); + + benchmarkHelper.SnapshotRttStats(); + } + + lock (typeof(Console)) + { + benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.PrintRttStats((int) idObj); + } + + ClientBandwidths[(int) idObj] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + + rawSocket.Close(); + rawSocket.Dispose(); + + return Task.CompletedTask; + } + + public async Task RunAsync() + { + if (Program.Constants.PacketCount > 10_000) + { + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + } + + ClientBandwidths = new double[1]; + Task[] clientTasks = new Task[] { Task.Factory.StartNew(BenchmarkClientTask, 0, TaskCreationOptions.LongRunning) }; + + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + rawSocket.Bind(Program.Constants.ServerEndPoint); + + using RawDatagramNetworkReader reader = new RawDatagramNetworkReader(ref rawSocket, RequestHandler, defaultRemoteEndPoint, Program.Constants.PacketSize); + reader.Start(1); + + ServerReadyEvent.Set(); + + await Task.WhenAll(clientTasks); + + Console.WriteLine($"Total estimated bandwidth: {ClientBandwidths.Sum():F3}"); + + reader.Shutdown(); + + rawSocket.Close(); + rawSocket.Dispose(); + } + } +} +\ No newline at end of file diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkReaderMultiClientBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkReaderMultiClientBenchmark.cs @@ -11,12 +11,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks { internal class RawDatagramNetworkReaderMultiClientBenchmark : INetSharpBenchmark { - private const int PacketSize = 8192, PacketCount = 1_000_000, ClientCount = 8; private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); private double[] ClientBandwidths; /// <inheritdoc /> - public string Name { get; } = "Raw Datagram Network Reader (Multiple Clients) Benchmark"; + public string Name => "Raw Datagram Network Reader (Multiple Clients) Benchmark"; private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, in Memory<byte> responseBuffer) @@ -32,12 +31,13 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - byte[] sendBuffer = new byte[PacketSize]; - byte[] receiveBuffer = new byte[PacketSize]; + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; using Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + clientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); clientSocket.Bind(Program.Constants.ClientEndPoint); lock (typeof(Console)) @@ -49,7 +49,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks ServerReadyEvent.Wait(); - for (int i = 0; i < PacketCount; i++) + for (int i = 0; i < Program.Constants.PacketCount; i++) { byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); @@ -65,11 +65,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks lock (typeof(Console)) { - benchmarkHelper.PrintBandwidthStats(id, PacketCount, PacketSize); + benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); benchmarkHelper.PrintRttStats(id); } - ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(PacketCount, PacketSize); + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); clientSocket.Close(); @@ -79,13 +79,13 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks /// <inheritdoc /> public async Task RunAsync() { - if (PacketCount > 10_000) + if (Program.Constants.PacketCount > 10_000) { - Console.WriteLine($"{PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); } - ClientBandwidths = new double[ClientCount]; - Task[] clientTasks = new Task[ClientCount]; + ClientBandwidths = new double[Program.Constants.ClientCount]; + Task[] clientTasks = new Task[Program.Constants.ClientCount]; for (int i = 0; i < clientTasks.Length; i++) { clientTasks[i] = Task.Factory.StartNew(BenchmarkClientTask, i, TaskCreationOptions.LongRunning); @@ -97,8 +97,8 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ServerEndPoint); - using RawDatagramNetworkReader reader = new RawDatagramNetworkReader(ref rawSocket, RequestHandler, defaultRemoteEndPoint, PacketSize); - reader.Start(ClientCount); + using RawDatagramNetworkReader reader = new RawDatagramNetworkReader(ref rawSocket, RequestHandler, defaultRemoteEndPoint, Program.Constants.PacketSize); + reader.Start(Program.Constants.ClientCount); ServerReadyEvent.Set(); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkReaderSingleClientBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkReaderSingleClientBenchmark.cs @@ -11,12 +11,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks { internal class RawDatagramNetworkReaderSingleClientBenchmark : INetSharpBenchmark { - private const int PacketSize = 8192, PacketCount = 1_000_000; private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); private double[] ClientBandwidths; /// <inheritdoc /> - public string Name { get; } = "Raw Datagram Network Reader (Single Client) Benchmark"; + public string Name => "Raw Datagram Network Reader (Single Client) Benchmark"; private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, in Memory<byte> responseBuffer) @@ -32,12 +31,13 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - byte[] sendBuffer = new byte[PacketSize]; - byte[] receiveBuffer = new byte[PacketSize]; + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; using Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + clientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); clientSocket.Bind(Program.Constants.ClientEndPoint); lock (typeof(Console)) @@ -49,7 +49,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks ServerReadyEvent.Wait(); - for (int i = 0; i < PacketCount; i++) + for (int i = 0; i < Program.Constants.PacketCount; i++) { byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); @@ -65,11 +65,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks lock (typeof(Console)) { - benchmarkHelper.PrintBandwidthStats(id, PacketCount, PacketSize); + benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); benchmarkHelper.PrintRttStats(id); } - ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(PacketCount, PacketSize); + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); clientSocket.Close(); @@ -79,9 +79,9 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks /// <inheritdoc /> public async Task RunAsync() { - if (PacketCount > 10_000) + if (Program.Constants.PacketCount > 10_000) { - Console.WriteLine($"{PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); } ClientBandwidths = new double[1]; @@ -93,7 +93,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ServerEndPoint); - using RawDatagramNetworkReader reader = new RawDatagramNetworkReader(ref rawSocket, RequestHandler, defaultRemoteEndPoint, PacketSize); + using RawDatagramNetworkReader reader = new RawDatagramNetworkReader(ref rawSocket, RequestHandler, defaultRemoteEndPoint, Program.Constants.PacketSize); reader.Start(1); ServerReadyEvent.Set(); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkWriterAsyncBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkWriterAsyncBenchmark.cs @@ -10,11 +10,10 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks { internal class RawDatagramNetworkWriterAsyncBenchmark : INetSharpBenchmark { - private const int PacketSize = 8192, PacketCount = 1_000_000; private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); /// <inheritdoc /> - public string Name { get; } = "Raw Datagram Network Writer Benchmark (Asynchronous)"; + public string Name => "Raw Datagram Network Writer Benchmark (Asynchronous)"; private static Task ServerTask(CancellationToken cancellationToken) { @@ -22,7 +21,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); server.Bind(Program.Constants.ServerEndPoint); - byte[] transmissionBuffer = new byte[PacketSize]; + byte[] transmissionBuffer = new byte[Program.Constants.PacketSize]; EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); @@ -43,22 +42,23 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks /// <inheritdoc /> public async Task RunAsync() { - if (PacketCount > 10_000) + if (Program.Constants.PacketCount > 10_000) { - Console.WriteLine($"{PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); } EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - byte[] sendBuffer = new byte[PacketSize]; - byte[] receiveBuffer = new byte[PacketSize]; + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ClientEndPoint); - using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, PacketSize); + using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); using CancellationTokenSource serverCts = new CancellationTokenSource(); Task serverTask = Task.Factory.StartNew(state => ServerTask((CancellationToken) state), serverCts.Token, TaskCreationOptions.LongRunning); @@ -67,7 +67,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks ServerReadyEvent.Wait(); - for (int i = 0; i < PacketCount; i++) + for (int i = 0; i < Program.Constants.PacketCount; i++) { byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); @@ -81,18 +81,10 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks benchmarkHelper.SnapshotRttStats(); } - benchmarkHelper.PrintBandwidthStats(0, PacketCount, PacketSize); + benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); benchmarkHelper.PrintRttStats(0); serverCts.Cancel(); - try - { - serverTask.Dispose(); - } - catch (Exception) - { - // ignored - } rawSocket.Close(); rawSocket.Dispose(); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkWriterSyncBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/RawDatagramNetworkWriterSyncBenchmark.cs @@ -10,11 +10,10 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks { internal class RawDatagramNetworkWriterSyncBenchmark : INetSharpBenchmark { - private const int PacketSize = 8192, PacketCount = 1_000_000; private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); /// <inheritdoc /> - public string Name { get; } = "Raw Datagram Network Writer Benchmark (Synchronous)"; + public string Name => "Raw Datagram Network Writer Benchmark (Synchronous)"; private static Task ServerTask(CancellationToken cancellationToken) { @@ -22,7 +21,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); server.Bind(Program.Constants.ServerEndPoint); - byte[] transmissionBuffer = new byte[PacketSize]; + byte[] transmissionBuffer = new byte[Program.Constants.PacketSize]; EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); @@ -43,24 +42,25 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks /// <inheritdoc /> public Task RunAsync() { - if (PacketCount > 10_000) + if (Program.Constants.PacketCount > 10_000) { - Console.WriteLine($"{PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); } EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - byte[] sendBuffer = new byte[PacketSize]; - byte[] receiveBuffer = new byte[PacketSize]; + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ClientEndPoint); - using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, PacketSize); + using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); using CancellationTokenSource serverCts = new CancellationTokenSource(); Task serverTask = Task.Factory.StartNew(state => ServerTask((CancellationToken) state), serverCts.Token, TaskCreationOptions.LongRunning); @@ -69,7 +69,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks benchmarkHelper.ResetStopwatch(); - for (int i = 0; i < PacketCount; i++) + for (int i = 0; i < Program.Constants.PacketCount; i++) { byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); @@ -83,7 +83,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks benchmarkHelper.SnapshotRttStats(); } - benchmarkHelper.PrintBandwidthStats(0, PacketCount, PacketSize); + benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); benchmarkHelper.PrintRttStats(0); serverCts.Cancel(); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/CombinedMultiClientRawStreamBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/CombinedMultiClientRawStreamBenchmark.cs @@ -0,0 +1,115 @@ +using System; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +using NetSharp.Raw.Stream; + +namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks +{ + internal class CombinedMultiClientRawStreamBenchmark : INetSharpBenchmark + { + private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); + private double[] ClientBandwidths; + + public string Name => "Combined Raw Stream Network Reader/Writer (Multiple Clients) Benchmark"; + + private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer) + { + requestBuffer.CopyTo(responseBuffer); + + return true; + } + + private Task BenchmarkClientTask(object idObj) + { + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + + BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); + + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; + + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; + + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + rawSocket.Bind(Program.Constants.ClientEndPoint); + + using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); + + ServerReadyEvent.Wait(); + rawSocket.Connect(Program.Constants.ServerEndPoint); + + benchmarkHelper.ResetStopwatch(); + + for (int i = 0; i < Program.Constants.PacketCount; i++) + { + byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); + packetBuffer.CopyTo(sendBuffer, 0); + + benchmarkHelper.StartStopwatch(); + int sendResult = writer.Write(Program.Constants.ServerEndPoint, sendBuffer); + + int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); + benchmarkHelper.StopStopwatch(); + + benchmarkHelper.SnapshotRttStats(); + } + + lock (typeof(Console)) + { + benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.PrintRttStats((int) idObj); + } + + ClientBandwidths[(int) idObj] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + + rawSocket.Shutdown(SocketShutdown.Both); + rawSocket.Disconnect(false); + rawSocket.Close(); + rawSocket.Dispose(); + + return Task.CompletedTask; + } + + public async Task RunAsync() + { + if (Program.Constants.PacketCount > 10_000) + { + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + } + + ClientBandwidths = new double[Program.Constants.ClientCount]; + Task[] clientTasks = new Task[Program.Constants.ClientCount]; + for (int i = 0; i < clientTasks.Length; i++) + { + clientTasks[i] = Task.Factory.StartNew(BenchmarkClientTask, i, TaskCreationOptions.LongRunning); + } + + EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); + + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + rawSocket.Bind(Program.Constants.ServerEndPoint); + rawSocket.Listen(Program.Constants.ClientCount); + + using RawStreamNetworkReader reader = new RawStreamNetworkReader(ref rawSocket, RequestHandler, defaultEndPoint, Program.Constants.PacketSize); + reader.Start(Program.Constants.ClientCount); + + ServerReadyEvent.Set(); + + await Task.WhenAll(clientTasks); + + Console.WriteLine($"Total estimated bandwidth: {ClientBandwidths.Sum():F3}"); + + reader.Shutdown(); + + rawSocket.Close(); + rawSocket.Dispose(); + } + } +} +\ No newline at end of file diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/CombinedSingleClientRawStreamBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/CombinedSingleClientRawStreamBenchmark.cs @@ -0,0 +1,110 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +using NetSharp.Raw.Stream; + +namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks +{ + internal class CombinedSingleClientRawStreamBenchmark : INetSharpBenchmark + { + private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); + private double[] ClientBandwidths; + + public string Name => "Combined Raw Stream Network Reader/Writer (Single Client) Benchmark"; + + private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer) + { + requestBuffer.CopyTo(responseBuffer); + + return true; + } + + private Task BenchmarkClientTask(object idObj) + { + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + + BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); + + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; + + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; + + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + rawSocket.Bind(Program.Constants.ClientEndPoint); + + using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); + + ServerReadyEvent.Wait(); + rawSocket.Connect(Program.Constants.ServerEndPoint); + + benchmarkHelper.ResetStopwatch(); + + for (int i = 0; i < Program.Constants.PacketCount; i++) + { + byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); + packetBuffer.CopyTo(sendBuffer, 0); + + benchmarkHelper.StartStopwatch(); + int sendResult = writer.Write(Program.Constants.ServerEndPoint, sendBuffer); + + int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); + benchmarkHelper.StopStopwatch(); + + benchmarkHelper.SnapshotRttStats(); + } + + lock (typeof(Console)) + { + benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); + benchmarkHelper.PrintRttStats((int) idObj); + } + + ClientBandwidths[(int) idObj] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + + rawSocket.Shutdown(SocketShutdown.Both); + rawSocket.Disconnect(false); + rawSocket.Close(); + rawSocket.Dispose(); + + return Task.CompletedTask; + } + + public async Task RunAsync() + { + if (Program.Constants.PacketCount > 10_000) + { + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + } + + ClientBandwidths = new double[1]; + Task[] clientTasks = new Task[] { Task.Factory.StartNew(BenchmarkClientTask, 0, TaskCreationOptions.LongRunning) }; + + EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); + + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + rawSocket.Bind(Program.Constants.ServerEndPoint); + rawSocket.Listen(1); + + using RawStreamNetworkReader reader = new RawStreamNetworkReader(ref rawSocket, RequestHandler, defaultEndPoint, Program.Constants.PacketSize); + reader.Start(1); + + ServerReadyEvent.Set(); + + await clientTasks[0]; + + Console.WriteLine($"Total estimated bandwidth: {ClientBandwidths[0]:F3}"); + + reader.Shutdown(); + + rawSocket.Close(); + rawSocket.Dispose(); + } + } +} +\ No newline at end of file diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkReaderMultiClientBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkReaderMultiClientBenchmark.cs @@ -11,12 +11,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks { internal class RawStreamNetworkReaderMultiClientBenchmark : INetSharpBenchmark { - private const int PacketSize = 8192, PacketCount = 1_000_000, ClientCount = 8; private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); private double[] ClientBandwidths; /// <inheritdoc /> - public string Name { get; } = "Raw Stream Network Reader (Multiple Clients) Benchmark"; + public string Name => "Raw Stream Network Reader (Multiple Clients) Benchmark"; private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, in Memory<byte> responseBuffer) @@ -32,13 +31,14 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - byte[] sendBuffer = new byte[PacketSize + RawStreamPacketHeader.TotalSize]; - byte[] receiveBuffer = new byte[PacketSize + RawStreamPacketHeader.TotalSize]; - byte[] packetBuffer = new byte[PacketSize]; + byte[] sendBuffer = new byte[Program.Constants.PacketSize + RawStreamPacketHeader.TotalSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize + RawStreamPacketHeader.TotalSize]; + byte[] packetBuffer = new byte[Program.Constants.PacketSize]; EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; using Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + clientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); clientSocket.Bind(Program.Constants.ClientEndPoint); ServerReadyEvent.Wait(); @@ -51,11 +51,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks benchmarkHelper.ResetStopwatch(); - for (int i = 0; i < PacketCount; i++) + for (int i = 0; i < Program.Constants.PacketCount; i++) { Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})").CopyTo(packetBuffer, 0); - RawStreamPacketHeader streamPacketHeader = new RawStreamPacketHeader(PacketSize); + RawStreamPacketHeader streamPacketHeader = new RawStreamPacketHeader(Program.Constants.PacketSize); RawStreamPacket.Serialise(sendBuffer, in streamPacketHeader, packetBuffer); benchmarkHelper.StartStopwatch(); @@ -89,16 +89,17 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks benchmarkHelper.SnapshotRttStats(); } - clientSocket.Disconnect(true); - clientSocket.Close(); - lock (typeof(Console)) { - benchmarkHelper.PrintBandwidthStats(id, PacketCount, PacketSize); + benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); benchmarkHelper.PrintRttStats(id); } - ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(PacketCount, PacketSize); + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + + clientSocket.Shutdown(SocketShutdown.Both); + clientSocket.Disconnect(false); + clientSocket.Close(); return Task.CompletedTask; } @@ -106,13 +107,13 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks /// <inheritdoc /> public async Task RunAsync() { - if (PacketCount > 10_000) + if (Program.Constants.PacketCount > 10_000) { - Console.WriteLine($"{PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); } - ClientBandwidths = new double[ClientCount]; - Task[] clientTasks = new Task[ClientCount]; + ClientBandwidths = new double[Program.Constants.ClientCount]; + Task[] clientTasks = new Task[Program.Constants.ClientCount]; for (int i = 0; i < clientTasks.Length; i++) { clientTasks[i] = Task.Factory.StartNew(BenchmarkClientTask, i, TaskCreationOptions.LongRunning); @@ -123,10 +124,10 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ServerEndPoint); - rawSocket.Listen(ClientCount); + rawSocket.Listen(Program.Constants.ClientCount); - using RawStreamNetworkReader reader = new RawStreamNetworkReader(ref rawSocket, RequestHandler, defaultEndPoint, PacketSize); - reader.Start(ClientCount); + using RawStreamNetworkReader reader = new RawStreamNetworkReader(ref rawSocket, RequestHandler, defaultEndPoint, Program.Constants.PacketSize); + reader.Start(Program.Constants.ClientCount); ServerReadyEvent.Set(); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkReaderSingleClientBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkReaderSingleClientBenchmark.cs @@ -10,12 +10,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks { internal class RawStreamNetworkReaderSingleClientBenchmark : INetSharpBenchmark { - private const int PacketSize = 8192, PacketCount = 1_000_000; private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); private double[] ClientBandwidths; /// <inheritdoc /> - public string Name { get; } = "Raw Stream Network Reader (Single Client) Benchmark"; + public string Name => "Raw Stream Network Reader (Single Client) Benchmark"; private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, in Memory<byte> responseBuffer) @@ -31,13 +30,14 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - byte[] sendBuffer = new byte[PacketSize + RawStreamPacketHeader.TotalSize]; - byte[] receiveBuffer = new byte[PacketSize + RawStreamPacketHeader.TotalSize]; - byte[] packetBuffer = new byte[PacketSize]; + byte[] sendBuffer = new byte[Program.Constants.PacketSize + RawStreamPacketHeader.TotalSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize + RawStreamPacketHeader.TotalSize]; + byte[] packetBuffer = new byte[Program.Constants.PacketSize]; EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; using Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + clientSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); clientSocket.Bind(Program.Constants.ClientEndPoint); ServerReadyEvent.Wait(); @@ -50,11 +50,11 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks benchmarkHelper.ResetStopwatch(); - for (int i = 0; i < PacketCount; i++) + for (int i = 0; i < Program.Constants.PacketCount; i++) { Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})").CopyTo(packetBuffer, 0); - RawStreamPacketHeader streamPacketHeader = new RawStreamPacketHeader(PacketSize); + RawStreamPacketHeader streamPacketHeader = new RawStreamPacketHeader(Program.Constants.PacketSize); RawStreamPacket.Serialise(sendBuffer, in streamPacketHeader, packetBuffer); benchmarkHelper.StartStopwatch(); @@ -88,16 +88,17 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks benchmarkHelper.SnapshotRttStats(); } - clientSocket.Disconnect(true); - clientSocket.Close(); - lock (typeof(Console)) { - benchmarkHelper.PrintBandwidthStats(id, PacketCount, PacketSize); + benchmarkHelper.PrintBandwidthStats(id, Program.Constants.PacketCount, Program.Constants.PacketSize); benchmarkHelper.PrintRttStats(id); } - ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(PacketCount, PacketSize); + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(Program.Constants.PacketCount, Program.Constants.PacketSize); + + clientSocket.Shutdown(SocketShutdown.Both); + clientSocket.Disconnect(false); + clientSocket.Close(); return Task.CompletedTask; } @@ -105,9 +106,9 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks /// <inheritdoc /> public async Task RunAsync() { - if (PacketCount > 10_000) + if (Program.Constants.PacketCount > 10_000) { - Console.WriteLine($"{PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); } ClientBandwidths = new double[1]; @@ -120,7 +121,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks rawSocket.Bind(Program.Constants.ServerEndPoint); rawSocket.Listen(1); - using RawStreamNetworkReader reader = new RawStreamNetworkReader(ref rawSocket, RequestHandler, defaultEndPoint, PacketSize); + using RawStreamNetworkReader reader = new RawStreamNetworkReader(ref rawSocket, RequestHandler, defaultEndPoint, Program.Constants.PacketSize); reader.Start(1); ServerReadyEvent.Set(); diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkWriterAsyncBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkWriterAsyncBenchmark.cs @@ -10,11 +10,10 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks { internal class RawStreamNetworkWriterAsyncBenchmark : INetSharpBenchmark { - private const int PacketSize = 8192, PacketCount = 1_000_000; private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); /// <inheritdoc /> - public string Name { get; } = "Raw Stream Network Writer Benchmark (Asynchronous)"; + public string Name => "Raw Stream Network Writer Benchmark (Asynchronous)"; private static Task ServerTask(CancellationToken cancellationToken) { @@ -22,7 +21,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); server.Bind(Program.Constants.ServerEndPoint); - RawStreamPacketHeader archetypalHeader = new RawStreamPacketHeader(PacketSize); + RawStreamPacketHeader archetypalHeader = new RawStreamPacketHeader(Program.Constants.PacketSize); byte[] transmissionBuffer = new byte[RawStreamPacket.TotalPacketSize(in archetypalHeader)]; server.Listen(1); @@ -67,22 +66,23 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks /// <inheritdoc /> public async Task RunAsync() { - if (PacketCount > 10_000) + if (Program.Constants.PacketCount > 10_000) { - Console.WriteLine($"{PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); } EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - byte[] sendBuffer = new byte[PacketSize]; - byte[] receiveBuffer = new byte[PacketSize]; + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ClientEndPoint); - using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultRemoteEndPoint, PacketSize); + using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); using CancellationTokenSource serverCts = new CancellationTokenSource(); Task serverTask = Task.Factory.StartNew(state => ServerTask((CancellationToken) state), serverCts.Token, TaskCreationOptions.LongRunning); @@ -92,7 +92,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks benchmarkHelper.ResetStopwatch(); - for (int i = 0; i < PacketCount; i++) + for (int i = 0; i < Program.Constants.PacketCount; i++) { byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); @@ -106,21 +106,13 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks benchmarkHelper.SnapshotRttStats(); } - benchmarkHelper.PrintBandwidthStats(0, PacketCount, PacketSize); + benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); benchmarkHelper.PrintRttStats(0); serverCts.Cancel(); - try - { - serverTask.Dispose(); - } - catch (Exception) - { - // ignored - } - rawSocket.Disconnect(false); rawSocket.Shutdown(SocketShutdown.Both); + rawSocket.Disconnect(false); rawSocket.Close(); rawSocket.Dispose(); } diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkWriterSyncBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Stream Network Connection Benchmarks/RawStreamNetworkWriterSyncBenchmark.cs @@ -10,11 +10,10 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks { internal class RawStreamNetworkWriterSyncBenchmark : INetSharpBenchmark { - private const int PacketSize = 8192, PacketCount = 1_000_000; private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); /// <inheritdoc /> - public string Name { get; } = "Raw Stream Network Writer Benchmark (Synchronous)"; + public string Name => "Raw Stream Network Writer Benchmark (Synchronous)"; private static Task ServerTask(CancellationToken cancellationToken) { @@ -23,7 +22,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks server.Bind(Program.Constants.ServerEndPoint); // all the headers should have the same packet size, so will fit in the transmission buffer - RawStreamPacketHeader archetypalHeader = new RawStreamPacketHeader(PacketSize); + RawStreamPacketHeader archetypalHeader = new RawStreamPacketHeader(Program.Constants.PacketSize); byte[] transmissionBuffer = new byte[RawStreamPacket.TotalPacketSize(in archetypalHeader)]; server.Listen(1); @@ -68,24 +67,25 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks /// <inheritdoc /> public Task RunAsync() { - if (PacketCount > 10_000) + if (Program.Constants.PacketCount > 10_000) { - Console.WriteLine($"{PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); + Console.WriteLine($"{Program.Constants.PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); } EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); - byte[] sendBuffer = new byte[PacketSize]; - byte[] receiveBuffer = new byte[PacketSize]; + byte[] sendBuffer = new byte[Program.Constants.PacketSize]; + byte[] receiveBuffer = new byte[Program.Constants.PacketSize]; EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + rawSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); rawSocket.Bind(Program.Constants.ClientEndPoint); - using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultRemoteEndPoint, PacketSize); + using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); using CancellationTokenSource serverCts = new CancellationTokenSource(); Task serverTask = Task.Factory.StartNew(state => ServerTask((CancellationToken) state), serverCts.Token, TaskCreationOptions.LongRunning); @@ -95,7 +95,7 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks benchmarkHelper.ResetStopwatch(); - for (int i = 0; i < PacketCount; i++) + for (int i = 0; i < Program.Constants.PacketCount; i++) { byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client 0] Hello World! (Packet {i})"); packetBuffer.CopyTo(sendBuffer, 0); @@ -109,21 +109,13 @@ namespace NetSharp.Benchmarks.Benchmarks.Stream_Network_Connection_Benchmarks benchmarkHelper.SnapshotRttStats(); } - benchmarkHelper.PrintBandwidthStats(0, PacketCount, PacketSize); + benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); benchmarkHelper.PrintRttStats(0); serverCts.Cancel(); - try - { - serverTask.Dispose(); - } - catch (Exception) - { - // ignored - } - rawSocket.Disconnect(false); rawSocket.Shutdown(SocketShutdown.Both); + rawSocket.Disconnect(false); rawSocket.Close(); rawSocket.Dispose(); diff --git a/NetSharp/NetSharp.Benchmarks/Program.cs b/NetSharp/NetSharp.Benchmarks/Program.cs @@ -115,6 +115,8 @@ namespace NetSharp.Benchmarks private const int DefaultExamplePort = 44231; private static readonly IPAddress DefaultExampleAddress = IPAddress.Loopback; + public const int PacketSize = 8192, PacketCount = 1_000_000, ClientCount = 8; + public static readonly EndPoint ClientEndPoint = new IPEndPoint(DefaultExampleAddress, 0); public static readonly Encoding ServerEncoding = Encoding.UTF8; public static readonly EndPoint ServerEndPoint = new IPEndPoint(DefaultExampleAddress, DefaultExamplePort);