commit 4cfd727913ef7a235559f7f60bed2ba85620b2dc parent 432aae78bd371b79f84d51722dd25070d6130290 Author: Mikolaj Lenczewski <mikolaj.lenczewski308@gmail.com> Date: Tue, 23 Jun 2020 17:00:28 +0100 Reverted using .NetBenchmark, as i cant be bothered to wait 100 iterations of 1 minute each every time i want to check whether the performance of the library has increased or decreased massively. 1 iteration is enough to see whether there has been an obvious performance regression, and you can always manually run the benchmark multiple times to get an average. Diffstat:
13 files changed, 135 insertions(+), 207 deletions(-)
diff --git a/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs b/NetSharp/NetSharp.Benchmarks/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs @@ -1,35 +1,19 @@ using System; -using System.Collections.Generic; -using System.Diagnostics; using System.Linq; using System.Net; using System.Net.Sockets; using System.Threading; using System.Threading.Tasks; -using BenchmarkDotNet.Attributes; - using NetSharp.Raw.Datagram; namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks { - public class DatagramNetworkReaderBenchmark : INetSharpBenchmark + internal class DatagramNetworkReaderBenchmark : INetSharpBenchmark { - private static readonly EndPoint ServerDefaultListenEndpoint = new IPEndPoint(IPAddress.Any, 0); - private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(false); - private Task[] _clientTasks; - private Socket _serverSocket; - private double[] ClientMegabyteBandwidths; - - public static IEnumerable<int> PacketCountParamsSource { get; } = Program.Constants.PacketCountParamsSource; - public static IEnumerable<int> PacketSizeParamsSource { get; } = Program.Constants.PacketSizeParamsSource; - public ushort BenchmarkClientCount { get; set; } = Program.Constants.ClientCount; - - [ParamsSource(nameof(PacketCountParamsSource))] - public int BenchmarkPacketCount { get; set; } - - [ParamsSource(nameof(PacketSizeParamsSource))] - public int BenchmarkPacketSize { get; set; } + private const int PacketSize = 8192, PacketCount = 1_000_000, ClientCount = 12; + private static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(); + private double[] ClientBandwidths; /// <inheritdoc /> public string Name { get; } = "Raw Datagram Network Reader Benchmark"; @@ -46,32 +30,41 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks { int id = (int) idObj; + BenchmarkHelper benchmarkHelper = new BenchmarkHelper(); + Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); clientSocket.Bind(Program.Constants.ClientEndPoint); ServerReadyEvent.Wait(); - byte[] transmissionBuffer = new byte[BenchmarkPacketSize]; + byte[] sendBuffer = new byte[PacketSize]; + byte[] receiveBuffer = new byte[PacketSize]; EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; - Stopwatch bandwidthStopwatch = new Stopwatch(); - bandwidthStopwatch.Reset(); - for (int i = 0; i < BenchmarkPacketCount; i++) + lock (typeof(Console)) + { + Console.WriteLine($"[Client {id}] Starting client; sending messages to {remoteEndPoint}"); + } + + for (int i = 0; i < PacketCount; i++) { byte[] packetBuffer = Program.Constants.ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); - packetBuffer.CopyTo(transmissionBuffer, 0); + packetBuffer.CopyTo(sendBuffer, 0); - bandwidthStopwatch.Start(); - int sentBytes = clientSocket.SendTo(transmissionBuffer, remoteEndPoint); + benchmarkHelper.StartStopwatch(); + int sentBytes = clientSocket.SendTo(sendBuffer, remoteEndPoint); - Array.Clear(transmissionBuffer, 0, BenchmarkPacketSize); + int receivedBytes = clientSocket.ReceiveFrom(receiveBuffer, ref remoteEndPoint); + benchmarkHelper.StopStopwatch(); - int receivedBytes = clientSocket.ReceiveFrom(transmissionBuffer, ref remoteEndPoint); - bandwidthStopwatch.Stop(); + benchmarkHelper.SnapshotRttStats(); } - ClientMegabyteBandwidths[id] = BenchmarkHelper.CalcBandwidth(bandwidthStopwatch.ElapsedMilliseconds, BenchmarkPacketCount, BenchmarkPacketSize); + benchmarkHelper.PrintBandwidthStats(id, PacketCount, PacketSize); + benchmarkHelper.PrintRttStats(id); + + ClientBandwidths[id] = benchmarkHelper.CalcBandwidth(PacketCount, PacketSize); clientSocket.Close(); clientSocket.Dispose(); @@ -79,100 +72,39 @@ namespace NetSharp.Benchmarks.Benchmarks.Datagram_Network_Connection_Benchmarks return Task.CompletedTask; } - [Benchmark(Description = "Measures performance of a Datagram Network Reader with multiple clients")] - public void MultipleClientPerformance() - { - using RawDatagramNetworkReader reader = new RawDatagramNetworkReader(ref _serverSocket, RequestHandler, ServerDefaultListenEndpoint, BenchmarkPacketSize); - reader.Start(BenchmarkClientCount); - - ServerReadyEvent.Set(); - - Task.WhenAll(_clientTasks).GetAwaiter().GetResult(); - - reader.Shutdown(); - } - - [IterationCleanup(Target = nameof(MultipleClientPerformance))] - public void MultipleClientPerformanceCleanup() - { - Console.WriteLine($"Total estimated bandwidth: {ClientMegabyteBandwidths.Sum():F3}"); - - _serverSocket.Close(); - _serverSocket.Dispose(); - } - - [GlobalCleanup(Target = nameof(MultipleClientPerformance))] - public void MultipleClientPerformanceGlobalCleanup() - { - } - - [GlobalSetup(Target = nameof(MultipleClientPerformance))] - public void MultipleClientPerformanceGlobalSetup() - { - } - - [IterationSetup(Target = nameof(MultipleClientPerformance))] - public void MultipleClientPerformanceSetup() + /// <inheritdoc /> + public async Task RunAsync() { - Console.WriteLine($"Packet Size: {BenchmarkPacketSize}, Packet Count: {BenchmarkPacketCount}, Client Count: {BenchmarkClientCount}"); - - ServerReadyEvent.Reset(); - - ClientMegabyteBandwidths = new double[BenchmarkClientCount]; - _clientTasks = new Task[BenchmarkClientCount]; - for (int i = 0; i < _clientTasks.Length; i++) + if (PacketCount > 10_000) { - _clientTasks[i] = Task.Factory.StartNew(BenchmarkClientTask, i, TaskCreationOptions.LongRunning); + Console.WriteLine($"{PacketCount} packets will be sent per client. This could take a long time (maybe more than a minute)!"); } - _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - _serverSocket.Bind(Program.Constants.ServerEndPoint); - } - - [Benchmark(Description = "Measures performance of a Datagram Network Reader with a single client")] - public void SingleClientPerformance() - { - using RawDatagramNetworkReader reader = new RawDatagramNetworkReader(ref _serverSocket, RequestHandler, ServerDefaultListenEndpoint, BenchmarkPacketSize); - reader.Start(BenchmarkClientCount); - - ServerReadyEvent.Set(); - - _clientTasks[0].GetAwaiter().GetResult(); - - reader.Shutdown(); - } + ClientBandwidths = new double[ClientCount]; + Task[] clientTasks = new Task[ClientCount]; + for (int i = 0; i < clientTasks.Length; i++) + { + clientTasks[i] = Task.Factory.StartNew(BenchmarkClientTask, i, TaskCreationOptions.LongRunning); + } - [IterationCleanup(Target = nameof(SingleClientPerformance))] - public void SingleClientPerformanceCleanup() - { - Console.WriteLine($"Total estimated bandwidth: {ClientMegabyteBandwidths.Sum():F3}"); + EndPoint defaultRemoteEndPoint = new IPEndPoint(IPAddress.Any, 0); - _serverSocket.Close(); - _serverSocket.Dispose(); - } + Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + rawSocket.Bind(Program.Constants.ServerEndPoint); - [GlobalCleanup(Target = nameof(SingleClientPerformance))] - public void SingleClientPerformanceGlobalCleanup() - { - } + using RawDatagramNetworkReader reader = new RawDatagramNetworkReader(ref rawSocket, RequestHandler, defaultRemoteEndPoint, PacketSize); + reader.Start(ClientCount); - [GlobalSetup(Target = nameof(SingleClientPerformance))] - public void SingleClientPerformanceGlobalSetup() - { - } + ServerReadyEvent.Set(); - [IterationSetup(Target = nameof(SingleClientPerformance))] - public void SingleClientPerformanceSetup() - { - Console.WriteLine($"Packet Size: {BenchmarkPacketSize}, Packet Count: {BenchmarkPacketCount}, Client Count: {BenchmarkClientCount}"); + await Task.WhenAll(clientTasks); - ServerReadyEvent.Reset(); + Console.WriteLine($"Total estimated bandwidth: {ClientBandwidths.Sum():F3}"); - ClientMegabyteBandwidths = new double[BenchmarkClientCount]; - _clientTasks = new Task[] { Task.Factory.StartNew(BenchmarkClientTask, 0, TaskCreationOptions.LongRunning) }; + reader.Shutdown(); - _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - _serverSocket.Bind(Program.Constants.ServerEndPoint); + rawSocket.Close(); + rawSocket.Dispose(); } } } \ No newline at end of file diff --git a/NetSharp/NetSharp.Benchmarks/INetSharpBenchmark.cs b/NetSharp/NetSharp.Benchmarks/INetSharpBenchmark.cs @@ -1,4 +1,6 @@ -namespace NetSharp.Benchmarks +using System.Threading.Tasks; + +namespace NetSharp.Benchmarks { /// <summary> /// Defines a benchmark program. @@ -9,5 +11,10 @@ /// The name of the benchmark. /// </summary> string Name { get; } + + /// <summary> + /// Runs the benchmark asynchronously. + /// </summary> + Task RunAsync(); } } \ No newline at end of file diff --git a/NetSharp/NetSharp.Benchmarks/NetSharp.Benchmarks.csproj b/NetSharp/NetSharp.Benchmarks/NetSharp.Benchmarks.csproj @@ -6,10 +6,6 @@ </PropertyGroup> <ItemGroup> - <PackageReference Include="BenchmarkDotNet" Version="0.12.1" /> - </ItemGroup> - - <ItemGroup> <ProjectReference Include="..\NetSharp\NetSharp.csproj" /> </ItemGroup> diff --git a/NetSharp/NetSharp.Benchmarks/Program.cs b/NetSharp/NetSharp.Benchmarks/Program.cs @@ -5,19 +5,22 @@ using System.Reflection; using System.Resources; using System.Text; -using BenchmarkDotNet.Running; - [assembly: NeutralResourcesLanguage("en")] namespace NetSharp.Benchmarks { internal class Program { - private static readonly List<Type> Benchmarks; + private const int DefaultExamplePort = 44231; + private static readonly List<INetSharpBenchmark> Benchmarks; + private static readonly IPAddress DefaultExampleAddress = IPAddress.Loopback; + public static readonly EndPoint DefaultClientEndPoint = new IPEndPoint(DefaultExampleAddress, 0); + public static readonly Encoding DefaultEncoding = Encoding.UTF8; + public static readonly EndPoint DefaultServerEndPoint = new IPEndPoint(DefaultExampleAddress, DefaultExamplePort); static Program() { - Benchmarks = new List<Type>(); + Benchmarks = new List<INetSharpBenchmark>(); foreach (Type type in Assembly.GetCallingAssembly().GetTypes()) { @@ -27,15 +30,16 @@ namespace NetSharp.Benchmarks } Type[] interfaces = type.GetInterfaces(); + object instance = Activator.CreateInstance(type); if (type.GetInterface(nameof(INetSharpBenchmark)) == typeof(INetSharpBenchmark)) { - Benchmarks.Add(type); + Benchmarks.Add((INetSharpBenchmark) instance); } } } - private static void Main(string[] args) + private static void Main() { RunAllBenchmarks(); @@ -49,7 +53,7 @@ namespace NetSharp.Benchmarks private static void PickBenchmark() { - Console.WriteLine("Available Benchmarks:"); + Console.WriteLine("Available Examples:"); for (int i = 0; i < Benchmarks.Count; i++) { Console.WriteLine($"\t{i:D2} - {Benchmarks[i].Name}"); @@ -70,12 +74,11 @@ namespace NetSharp.Benchmarks continue; } - Type selectedBenchmark = Benchmarks[choice]; - string selectedBenchmarkName = ((INetSharpBenchmark) Activator.CreateInstance(selectedBenchmark)).Name; + INetSharpBenchmark selectedExample = Benchmarks[choice]; - Console.WriteLine($"Starting \'{selectedBenchmarkName}\'..."); - BenchmarkRunner.Run(selectedBenchmark); - Console.WriteLine($"Finished \'{selectedBenchmarkName}\'!"); + Console.WriteLine($"Starting \'{selectedExample.Name}\'..."); + selectedExample.RunAsync().GetAwaiter().GetResult(); + Console.WriteLine($"Finished \'{selectedExample.Name}\'!"); break; } @@ -99,7 +102,14 @@ namespace NetSharp.Benchmarks if (input == "y") { - BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(); + foreach (INetSharpBenchmark benchmark in Benchmarks) + { + Console.WriteLine($"Starting \'{benchmark.Name}\'..."); + benchmark.RunAsync().GetAwaiter().GetResult(); + Console.WriteLine($"Finished \'{benchmark.Name}\'!"); + + Console.WriteLine(); + } } } @@ -112,9 +122,6 @@ namespace NetSharp.Benchmarks 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); - - public static IEnumerable<int> PacketCountParamsSource { get; } = new int[] { 10_000, 100_000, 1_000_000 }; - public static IEnumerable<int> PacketSizeParamsSource { get; } = new int[] { 4096, 8192, 16384, 32768 }; } } } \ No newline at end of file diff --git a/NetSharp/NetSharp.Examples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs b/NetSharp/NetSharp.Examples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs @@ -1,7 +1,6 @@ using System; using System.Net; using System.Net.Sockets; -using System.Text; using System.Threading.Tasks; using NetSharp.Raw.Datagram; @@ -11,8 +10,6 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples internal class DatagramNetworkReaderExample : INetSharpExample { private const int PacketSize = 8192, ExpectedClientCount = 8; - private static readonly Encoding ServerEncoding = Program.DefaultEncoding; - private static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Datagram Network Reader Example"; @@ -22,7 +19,7 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples { lock (typeof(Console)) { - string request = ServerEncoding.GetString(requestBuffer.Span).Trim('\0'); + string request = Program.Constants.ServerEncoding.GetString(requestBuffer.Span).Trim('\0'); Console.WriteLine($"[Server] Received request \'{request}\' ({receivedRequestBytes} bytes) from {remoteEndPoint}"); Console.WriteLine($"[Server] Sending response \'{request}\' ({receivedRequestBytes} bytes) to {remoteEndPoint}"); @@ -37,12 +34,12 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - rawSocket.Bind(ServerEndPoint); + rawSocket.Bind(Program.Constants.ServerEndPoint); using RawDatagramNetworkReader reader = new RawDatagramNetworkReader(ref rawSocket, RequestHandler, defaultEndPoint, PacketSize, 100); reader.Start(ExpectedClientCount); - Console.WriteLine($"Started datagram server at {ServerEndPoint}! Enter any key to stop the server..."); + Console.WriteLine($"Started datagram server at {Program.Constants.ServerEndPoint}! Enter any key to stop the server..."); Console.ReadLine(); reader.Shutdown(); diff --git a/NetSharp/NetSharp.Examples/Examples/Datagram Network Connection Examples/DatagramNetworkWriterAsyncExample.cs b/NetSharp/NetSharp.Examples/Examples/Datagram Network Connection Examples/DatagramNetworkWriterAsyncExample.cs @@ -1,7 +1,6 @@ using System; using System.Net; using System.Net.Sockets; -using System.Text; using System.Threading.Tasks; using NetSharp.Raw.Datagram; @@ -11,9 +10,6 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples internal class DatagramNetworkWriterAsyncExample : INetSharpExample { private const int PacketSize = 8192; - private static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; - private static readonly Encoding ServerEncoding = Program.DefaultEncoding; - private static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Datagram Network Writer Example (Asynchronous)"; @@ -24,13 +20,13 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - rawSocket.Bind(ClientEndPoint); + rawSocket.Bind(Program.Constants.ClientEndPoint); using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultEndPoint, PacketSize); byte[] transmissionBuffer = new byte[PacketSize]; - EndPoint remoteEndPoint = ServerEndPoint; + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; try { @@ -39,7 +35,7 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples Console.Write("Input to send to server: "); string userInput = Console.ReadLine(); - if (!ServerEncoding.GetBytes(userInput).AsMemory().TryCopyTo(transmissionBuffer)) + if (!Program.Constants.ServerEncoding.GetBytes(userInput).AsMemory().TryCopyTo(transmissionBuffer)) { Console.WriteLine("Given input is too large. Please try again!"); continue; @@ -59,7 +55,7 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples lock (typeof(Console)) { Console.WriteLine($"Received {received} bytes from {remoteEndPoint}!"); - Console.WriteLine(ServerEncoding.GetString(transmissionBuffer)); + Console.WriteLine(Program.Constants.ServerEncoding.GetString(transmissionBuffer)); } } } diff --git a/NetSharp/NetSharp.Examples/Examples/Datagram Network Connection Examples/DatagramNetworkWriterSyncExample.cs b/NetSharp/NetSharp.Examples/Examples/Datagram Network Connection Examples/DatagramNetworkWriterSyncExample.cs @@ -1,7 +1,6 @@ using System; using System.Net; using System.Net.Sockets; -using System.Text; using System.Threading.Tasks; using NetSharp.Raw.Datagram; @@ -11,9 +10,6 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples internal class DatagramNetworkWriterSyncExample : INetSharpExample { private const int PacketSize = 8192; - private static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; - private static readonly Encoding ServerEncoding = Program.DefaultEncoding; - private static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Datagram Network Writer Example (Synchronous)"; @@ -24,13 +20,13 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - rawSocket.Bind(ClientEndPoint); + rawSocket.Bind(Program.Constants.ClientEndPoint); using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultEndPoint, PacketSize); byte[] transmissionBuffer = new byte[PacketSize]; - EndPoint remoteEndPoint = ServerEndPoint; + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; try { @@ -39,7 +35,7 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples Console.Write("Input to send to server: "); string userInput = Console.ReadLine(); - if (!ServerEncoding.GetBytes(userInput).AsMemory().TryCopyTo(transmissionBuffer)) + if (!Program.Constants.ServerEncoding.GetBytes(userInput).AsMemory().TryCopyTo(transmissionBuffer)) { Console.WriteLine("Given input is too large. Please try again!"); continue; @@ -59,7 +55,7 @@ namespace NetSharp.Examples.Examples.Datagram_Network_Connection_Examples lock (typeof(Console)) { Console.WriteLine($"Received {received} bytes from {remoteEndPoint}!"); - Console.WriteLine(ServerEncoding.GetString(transmissionBuffer)); + Console.WriteLine(Program.Constants.ServerEncoding.GetString(transmissionBuffer)); } } } diff --git a/NetSharp/NetSharp.Examples/Examples/Stream Network Connection Examples/RawStreamChatServer.cs b/NetSharp/NetSharp.Examples/Examples/Stream Network Connection Examples/RawStreamChatServer.cs @@ -1,7 +1,6 @@ using System; using System.Net; using System.Net.Sockets; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -12,11 +11,7 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples internal class RawStreamChatServer : INetSharpExample { private static readonly int ChatPacketSize = 8192; - private static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; - private static readonly EndPoint DefaultEndPoint = new IPEndPoint(IPAddress.Any, 0); private static readonly ushort InitialClientCount = 4; - private static readonly Encoding ServerEncoding = Program.DefaultEncoding; - private static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; private static readonly ManualResetEventSlim serverStartedEvent = new ManualResetEventSlim(false); public string Name => "Raw Stream Chat Server"; @@ -24,10 +19,11 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples private static async Task ClientTask() { Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - clientSocket.Bind(ClientEndPoint); - clientSocket.Connect(ServerEndPoint); + clientSocket.Bind(Program.Constants.ClientEndPoint); + clientSocket.Connect(Program.Constants.ServerEndPoint); - using RawStreamNetworkWriter client = new RawStreamNetworkWriter(ref clientSocket, DefaultEndPoint, ChatPacketSize); + EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); + using RawStreamNetworkWriter client = new RawStreamNetworkWriter(ref clientSocket, defaultEndPoint, ChatPacketSize); byte[] transmissionBuffer = new byte[ChatPacketSize]; @@ -37,22 +33,22 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples { Console.Write("Enter string to send to the server: "); string request = Console.ReadLine(); - if (!ServerEncoding.GetBytes(request).AsMemory().TryCopyTo(transmissionBuffer)) + if (!Program.Constants.ServerEncoding.GetBytes(request).AsMemory().TryCopyTo(transmissionBuffer)) { Console.WriteLine("Could not copy message to transmission buffer. Please try again!"); continue; } - int sentBytes = await client.WriteAsync(ServerEndPoint, transmissionBuffer); + int sentBytes = await client.WriteAsync(Program.Constants.ServerEndPoint, transmissionBuffer); Console.WriteLine($"[{clientSocket.LocalEndPoint}] Sent {sentBytes} bytes to server:"); Console.WriteLine($"\t{request}"); Array.Clear(transmissionBuffer, 0, transmissionBuffer.Length); - int receivedBytes = await client.ReadAsync(ServerEndPoint, transmissionBuffer); + int receivedBytes = await client.ReadAsync(Program.Constants.ServerEndPoint, transmissionBuffer); - string response = ServerEncoding.GetString(transmissionBuffer); + string response = Program.Constants.ServerEncoding.GetString(transmissionBuffer); Console.WriteLine($"[{clientSocket.LocalEndPoint}] Received {receivedBytes} bytes from server!"); Console.WriteLine($"\t{response}"); @@ -76,7 +72,7 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples { lock (typeof(Console)) { - string request = ServerEncoding.GetString(requestBuffer.Span).Trim('\0'); + string request = Program.Constants.ServerEncoding.GetString(requestBuffer.Span).Trim('\0'); Console.WriteLine($"[Server] Received request \'{request}\' ({receivedRequestBytes} bytes) from {remoteEndPoint}"); Console.WriteLine($"[Server] Sending response \'{request}\' ({receivedRequestBytes} bytes) to {remoteEndPoint}"); @@ -89,16 +85,17 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples { Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - serverSocket.Bind(ServerEndPoint); + serverSocket.Bind(Program.Constants.ServerEndPoint); serverSocket.Listen(InitialClientCount); - using RawStreamNetworkReader server = new RawStreamNetworkReader(ref serverSocket, ServerPacketHandler, DefaultEndPoint, ChatPacketSize); + EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); + using RawStreamNetworkReader server = new RawStreamNetworkReader(ref serverSocket, ServerPacketHandler, defaultEndPoint, ChatPacketSize); Console.WriteLine("[Server] Starting server..."); server.Start(InitialClientCount); - Console.WriteLine($"[Server] Started up on {ServerEndPoint}!"); + Console.WriteLine($"[Server] Started up on {Program.Constants.ServerEndPoint}!"); serverStartedEvent.Set(); while (true) diff --git a/NetSharp/NetSharp.Examples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs b/NetSharp/NetSharp.Examples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs @@ -1,7 +1,6 @@ using System; using System.Net; using System.Net.Sockets; -using System.Text; using System.Threading.Tasks; using NetSharp.Raw.Stream; @@ -11,8 +10,6 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples internal class StreamNetworkReaderExample : INetSharpExample { private const int PacketSize = 8192, ExpectedClientCount = 8; - private static readonly Encoding ServerEncoding = Program.DefaultEncoding; - private static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Raw Stream Network Reader Example"; @@ -22,7 +19,7 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples { lock (typeof(Console)) { - string request = ServerEncoding.GetString(requestBuffer.Span).Trim('\0'); + string request = Program.Constants.ServerEncoding.GetString(requestBuffer.Span).Trim('\0'); Console.WriteLine($"[Server] Received request \'{request}\' ({receivedRequestBytes} bytes) from {remoteEndPoint}"); Console.WriteLine($"[Server] Sending response \'{request}\' ({receivedRequestBytes} bytes) to {remoteEndPoint}"); @@ -37,13 +34,13 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - rawSocket.Bind(ServerEndPoint); + rawSocket.Bind(Program.Constants.ServerEndPoint); rawSocket.Listen(ExpectedClientCount); using RawStreamNetworkReader reader = new RawStreamNetworkReader(ref rawSocket, RequestHandler, defaultEndPoint, PacketSize, 100); reader.Start(ExpectedClientCount); - Console.WriteLine($"Started stream server at {ServerEndPoint}! Enter any key to stop the server..."); + Console.WriteLine($"Started stream server at {Program.Constants.ServerEndPoint}! Enter any key to stop the server..."); Console.ReadLine(); reader.Shutdown(); diff --git a/NetSharp/NetSharp.Examples/Examples/Stream Network Connection Examples/StreamNetworkWriterAsyncExample.cs b/NetSharp/NetSharp.Examples/Examples/Stream Network Connection Examples/StreamNetworkWriterAsyncExample.cs @@ -1,7 +1,6 @@ using System; using System.Net; using System.Net.Sockets; -using System.Text; using System.Threading.Tasks; using NetSharp.Raw.Stream; @@ -11,9 +10,6 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples internal class StreamNetworkWriterAsyncExample : INetSharpExample { private const int PacketSize = 8192; - private static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; - private static readonly Encoding ServerEncoding = Program.DefaultEncoding; - private static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Raw Stream Network Writer Example (Asynchronous)"; @@ -24,14 +20,14 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - rawSocket.Bind(ClientEndPoint); - rawSocket.Connect(ServerEndPoint); + rawSocket.Bind(Program.Constants.ClientEndPoint); + rawSocket.Connect(Program.Constants.ServerEndPoint); using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultEndPoint, PacketSize); byte[] transmissionBuffer = new byte[PacketSize]; - EndPoint remoteEndPoint = ServerEndPoint; + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; try { @@ -40,7 +36,7 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples Console.Write("Input to send to server: "); string userInput = Console.ReadLine(); - if (!ServerEncoding.GetBytes(userInput).AsMemory().TryCopyTo(transmissionBuffer)) + if (!Program.Constants.ServerEncoding.GetBytes(userInput).AsMemory().TryCopyTo(transmissionBuffer)) { Console.WriteLine("Given input is too large. Please try again!"); continue; @@ -60,7 +56,7 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples lock (typeof(Console)) { Console.WriteLine($"Received {received} bytes from {remoteEndPoint}!"); - Console.WriteLine(ServerEncoding.GetString(transmissionBuffer)); + Console.WriteLine(Program.Constants.ServerEncoding.GetString(transmissionBuffer)); } } } diff --git a/NetSharp/NetSharp.Examples/Examples/Stream Network Connection Examples/StreamNetworkWriterSyncExample.cs b/NetSharp/NetSharp.Examples/Examples/Stream Network Connection Examples/StreamNetworkWriterSyncExample.cs @@ -1,7 +1,6 @@ using System; using System.Net; using System.Net.Sockets; -using System.Text; using System.Threading.Tasks; using NetSharp.Raw.Stream; @@ -11,9 +10,6 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples internal class StreamNetworkWriterSyncExample : INetSharpExample { private const int PacketSize = 8192; - private static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; - private static readonly Encoding ServerEncoding = Program.DefaultEncoding; - private static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Raw Stream Network Writer Example (Synchronous)"; @@ -24,14 +20,14 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - rawSocket.Bind(ClientEndPoint); - rawSocket.Connect(ServerEndPoint); + rawSocket.Bind(Program.Constants.ClientEndPoint); + rawSocket.Connect(Program.Constants.ServerEndPoint); using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultEndPoint, PacketSize); byte[] transmissionBuffer = new byte[PacketSize]; - EndPoint remoteEndPoint = ServerEndPoint; + EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; try { @@ -40,7 +36,7 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples Console.Write("Input to send to server: "); string userInput = Console.ReadLine(); - if (!ServerEncoding.GetBytes(userInput).AsMemory().TryCopyTo(transmissionBuffer)) + if (!Program.Constants.ServerEncoding.GetBytes(userInput).AsMemory().TryCopyTo(transmissionBuffer)) { Console.WriteLine("Given input is too large. Please try again!"); continue; @@ -60,7 +56,7 @@ namespace NetSharp.Examples.Examples.Stream_Network_Connection_Examples lock (typeof(Console)) { Console.WriteLine($"Received {received} bytes from {remoteEndPoint}!"); - Console.WriteLine(ServerEncoding.GetString(transmissionBuffer)); + Console.WriteLine(Program.Constants.ServerEncoding.GetString(transmissionBuffer)); } } } diff --git a/NetSharp/NetSharp.Examples/Program.cs b/NetSharp/NetSharp.Examples/Program.cs @@ -11,12 +11,7 @@ namespace NetSharp.Examples { internal class Program { - private const int DefaultExamplePort = 44230; - private static readonly IPAddress DefaultExampleAddress = IPAddress.Loopback; private static readonly List<INetSharpExample> Examples; - public static readonly EndPoint DefaultClientEndPoint = new IPEndPoint(DefaultExampleAddress, 0); - public static readonly Encoding DefaultEncoding = Encoding.UTF8; - public static readonly EndPoint DefaultServerEndPoint = new IPEndPoint(DefaultExampleAddress, DefaultExamplePort); static Program() { @@ -92,5 +87,16 @@ namespace NetSharp.Examples Console.WriteLine(); } + + public static class Constants + { + private const int DefaultExamplePort = 44232; + private static readonly IPAddress DefaultExampleAddress = IPAddress.Loopback; + + public const int ClientCount = 12; + 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); + } } } \ No newline at end of file diff --git a/NetSharp/NetSharp.Tests/Program.cs b/NetSharp/NetSharp.Tests/Program.cs @@ -9,15 +9,20 @@ namespace NetSharp.Tests { internal class Program { - private const int DefaultExamplePort = 44232; - private static readonly IPAddress DefaultExampleAddress = IPAddress.Loopback; - public static readonly EndPoint DefaultClientEndPoint = new IPEndPoint(DefaultExampleAddress, 0); - public static readonly Encoding DefaultEncoding = Encoding.UTF8; - public static readonly EndPoint DefaultServerEndPoint = new IPEndPoint(DefaultExampleAddress, DefaultExamplePort); - private static void Main() { Console.WriteLine("Hello World!"); } + + public static class Constants + { + private const int DefaultExamplePort = 44233; + private static readonly IPAddress DefaultExampleAddress = IPAddress.Loopback; + + public const int ClientCount = 12; + 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); + } } } \ No newline at end of file