/// <inheritdoc /> public Task RunAsync() { EndPoint defaultEndPoint = new IPEndPoint(IPAddress.Any, 0); Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); rawSocket.Bind(Program.Constants.ClientEndPoint); using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultEndPoint, PacketSize); byte[] transmissionBuffer = new byte[PacketSize]; EndPoint remoteEndPoint = Program.Constants.ServerEndPoint; try { while (true) { Console.Write("Input to send to server: "); string userInput = Console.ReadLine(); if (!Program.Constants.ServerEncoding.GetBytes(userInput).AsMemory().TryCopyTo(transmissionBuffer)) { Console.WriteLine("Given input is too large. Please try again!"); continue; } int sent = writer.Write(remoteEndPoint, transmissionBuffer); lock (typeof(Console)) { Console.WriteLine($"Sent {sent} bytes to {remoteEndPoint}!"); } Array.Clear(transmissionBuffer, 0, transmissionBuffer.Length); int received = writer.Read(ref remoteEndPoint, transmissionBuffer); lock (typeof(Console)) { Console.WriteLine($"Received {received} bytes from {remoteEndPoint}!"); Console.WriteLine(Program.Constants.ServerEncoding.GetString(transmissionBuffer)); } } } finally { rawSocket.Close(); rawSocket.Dispose(); } }
/// <inheritdoc /> 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)!"); } Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); rawSocket.Bind(Program.Constants.ClientEndPoint); try { 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; using RawDatagramNetworkWriter writer = new RawDatagramNetworkWriter(ref rawSocket, defaultRemoteEndPoint, Program.Constants.PacketSize); Task serverTask = Task.Factory.StartNew(ServerTask, TaskCreationOptions.LongRunning); lock (typeof(Console)) { Console.WriteLine($"[Client {0}] Starting client at {rawSocket.LocalEndPoint}; sending messages to {remoteEndPoint}"); } benchmarkHelper.ResetStopwatch(); ServerReadyEvent.Wait(); 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(remoteEndPoint, sendBuffer); int receiveResult = writer.Read(ref remoteEndPoint, receiveBuffer); benchmarkHelper.StopStopwatch(); benchmarkHelper.SnapshotRttStats(); } benchmarkHelper.PrintBandwidthStats(0, Program.Constants.PacketCount, Program.Constants.PacketSize); benchmarkHelper.PrintRttStats(0); serverTask.GetAwaiter().GetResult(); } catch (Exception ex) { Console.WriteLine("Client exception: {0}", ex); } rawSocket.Close(); rawSocket.Dispose(); }