NetSharp

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

commit dc470ccd0f71ff986ccf65bafb4800231d50a841
parent c7d230d986eec1e656dcfff2fec3996b7e07e371
Author: Mikolaj Lenczewski <mikolaj.lenczewski308@gmail.com>
Date:   Thu, 11 Jun 2020 18:10:58 +0100

Simplified the RawNetworkWriter (removed Connect and Disconnect methods, as they arent relevant to writing data to the network; they are a prerequisite to such actions and thus are not our problem). Also changed the default port used by the examples, and added a raw stream chat server example.

Diffstat:
MNetSharp/NetSharp/INetworkWriter.cs | 4----
MNetSharp/NetSharp/NetSharp.xml | 18------------------
MNetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkWriter.cs | 53-----------------------------------------------------
MNetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs | 2+-
MNetSharp/NetSharp/Raw/RawNetworkWriterBase.cs | 18+-----------------
MNetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs | 2++
MNetSharp/NetSharp/Raw/Stream/RawStreamNetworkWriter.cs | 106+------------------------------------------------------------------------------
MNetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs | 8++++----
MNetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkWriterAsyncBenchmark.cs | 9++++-----
MNetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkWriterSyncBenchmark.cs | 9++++-----
MNetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkReaderBenchmark.cs | 8++++----
MNetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkWriterAsyncBenchmark.cs | 9++++-----
MNetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkWriterSyncBenchmark.cs | 9++++-----
MNetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs | 7++++---
MNetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkWriterAsyncExample.cs | 9++++-----
MNetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkWriterSyncExample.cs | 9++++-----
ANetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/RawStreamChatServer.cs | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MNetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs | 7++++---
MNetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkWriterAsyncExample.cs | 49+++++++++++++++++++++++++++++--------------------
MNetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkWriterSyncExample.cs | 49+++++++++++++++++++++++++++++--------------------
MNetSharp/NetSharpExamples/Program.cs | 8++++++++
21 files changed, 233 insertions(+), 282 deletions(-)

diff --git a/NetSharp/NetSharp/INetworkWriter.cs b/NetSharp/NetSharp/INetworkWriter.cs @@ -7,10 +7,6 @@ namespace NetSharp { public interface INetworkWriter { - public void Connect(EndPoint remoteEndPoint); - - public ValueTask ConnectAsync(EndPoint remoteEndPoint); - public int Read(ref EndPoint remoteEndPoint, Memory<byte> readBuffer, SocketFlags flags = SocketFlags.None); diff --git a/NetSharp/NetSharp/NetSharp.xml b/NetSharp/NetSharp/NetSharp.xml @@ -37,12 +37,6 @@ <member name="M:NetSharp.Raw.Datagram.RawDatagramNetworkWriter.ResetStateObject(System.Net.Sockets.SocketAsyncEventArgs@)"> <inheritdoc /> </member> - <member name="M:NetSharp.Raw.Datagram.RawDatagramNetworkWriter.Connect(System.Net.EndPoint)"> - <inheritdoc /> - </member> - <member name="M:NetSharp.Raw.Datagram.RawDatagramNetworkWriter.ConnectAsync(System.Net.EndPoint)"> - <inheritdoc /> - </member> <member name="M:NetSharp.Raw.Datagram.RawDatagramNetworkWriter.Read(System.Net.EndPoint@,System.Memory{System.Byte},System.Net.Sockets.SocketFlags)"> <inheritdoc /> </member> @@ -96,12 +90,6 @@ <member name="M:NetSharp.Raw.RawNetworkWriterBase.#ctor(System.Net.Sockets.Socket@,System.Net.EndPoint,System.Int32,System.Int32,System.UInt32)"> <inheritdoc /> </member> - <member name="M:NetSharp.Raw.RawNetworkWriterBase.Connect(System.Net.EndPoint)"> - <inheritdoc /> - </member> - <member name="M:NetSharp.Raw.RawNetworkWriterBase.ConnectAsync(System.Net.EndPoint)"> - <inheritdoc /> - </member> <member name="M:NetSharp.Raw.RawNetworkWriterBase.Read(System.Net.EndPoint@,System.Memory{System.Byte},System.Net.Sockets.SocketFlags)"> <inheritdoc /> </member> @@ -147,12 +135,6 @@ <member name="M:NetSharp.Raw.Stream.RawStreamNetworkWriter.ResetStateObject(System.Net.Sockets.SocketAsyncEventArgs@)"> <inheritdoc /> </member> - <member name="M:NetSharp.Raw.Stream.RawStreamNetworkWriter.Connect(System.Net.EndPoint)"> - <inheritdoc /> - </member> - <member name="M:NetSharp.Raw.Stream.RawStreamNetworkWriter.ConnectAsync(System.Net.EndPoint)"> - <inheritdoc /> - </member> <member name="T:NetSharp.Utils.BiDictionary`2"> <summary> Represents a concurrent two-way dictionary, that can be indexed by either a key or a value. diff --git a/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkWriter.cs b/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkWriter.cs @@ -24,28 +24,6 @@ namespace NetSharp.Raw.Datagram this.datagramSize = datagramSize; } - private void CompleteConnect(SocketAsyncEventArgs args) - { - OperationToken token = (OperationToken) args.UserToken; - - switch (args.SocketError) - { - case SocketError.Success: - token.CompletionSource.SetResult(true); - break; - - case SocketError.OperationAborted: - token.CompletionSource.SetCanceled(); - break; - - default: - token.CompletionSource.SetException(new SocketException((int) args.SocketError)); - break; - } - - ArgsPool.Return(args); - } - private void CompleteReceiveFrom(SocketAsyncEventArgs args) { PacketReadToken token = (PacketReadToken) args.UserToken; @@ -101,10 +79,6 @@ namespace NetSharp.Raw.Datagram { switch (args.LastOperation) { - case SocketAsyncOperation.Connect: - CompleteConnect(args); - break; - case SocketAsyncOperation.SendTo: CompleteSendTo(args); break; @@ -143,33 +117,6 @@ namespace NetSharp.Raw.Datagram } /// <inheritdoc /> - public override void Connect(EndPoint remoteEndPoint) - { - Connection.Connect(remoteEndPoint); - } - - /// <inheritdoc /> - public override ValueTask ConnectAsync(EndPoint remoteEndPoint) - { - TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); - SocketAsyncEventArgs args = ArgsPool.Rent(); - - args.RemoteEndPoint = remoteEndPoint; - - OperationToken token = new OperationToken(tcs); - args.UserToken = token; - - if (Connection.ConnectAsync(args)) - { - return new ValueTask(tcs.Task); - } - - ArgsPool.Return(args); - - return new ValueTask(); - } - - /// <inheritdoc /> public override int Read(ref EndPoint remoteEndPoint, Memory<byte> readBuffer, SocketFlags flags = SocketFlags.None) { int totalBytes = readBuffer.Length; diff --git a/NetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs b/NetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs @@ -11,7 +11,7 @@ namespace NetSharp.Raw public abstract class RawNetworkConnectionBase : IDisposable { // https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/Buffers/ConfigurableArrayPool.cs - private const int DefaultMaxPooledBufferSize = 1024 * 1024, DefaultMaxPooledBuffersPerBucket = 50; + protected const int DefaultMaxPooledBufferSize = 1024 * 1024, DefaultMaxPooledBuffersPerBucket = 50; protected readonly SlimObjectPool<SocketAsyncEventArgs> ArgsPool; protected readonly ArrayPool<byte> BufferPool; diff --git a/NetSharp/NetSharp/Raw/RawNetworkWriterBase.cs b/NetSharp/NetSharp/Raw/RawNetworkWriterBase.cs @@ -8,18 +8,12 @@ namespace NetSharp.Raw public abstract class RawNetworkWriterBase : RawNetworkConnectionBase, INetworkWriter { /// <inheritdoc /> - protected RawNetworkWriterBase(ref Socket rawConnection, EndPoint defaultEndPoint, int maxPooledBufferSize, int pooledBuffersPerBucket = 50, + protected RawNetworkWriterBase(ref Socket rawConnection, EndPoint defaultEndPoint, int maxPooledBufferSize = DefaultMaxPooledBufferSize, int pooledBuffersPerBucket = 50, uint preallocatedStateObjects = 0) : base(ref rawConnection, defaultEndPoint, maxPooledBufferSize, pooledBuffersPerBucket, preallocatedStateObjects) { } /// <inheritdoc /> - public abstract void Connect(EndPoint remoteEndPoint); - - /// <inheritdoc /> - public abstract ValueTask ConnectAsync(EndPoint remoteEndPoint); - - /// <inheritdoc /> public abstract int Read(ref EndPoint remoteEndPoint, Memory<byte> readBuffer, SocketFlags flags = SocketFlags.None); @@ -34,15 +28,5 @@ namespace NetSharp.Raw /// <inheritdoc /> public abstract ValueTask<int> WriteAsync(EndPoint remoteEndPoint, ReadOnlyMemory<byte> writeBuffer, SocketFlags flags = SocketFlags.None); - - protected readonly struct OperationToken - { - public readonly TaskCompletionSource<bool> CompletionSource; - - public OperationToken(TaskCompletionSource<bool> completionSource) - { - CompletionSource = completionSource; - } - } } } \ No newline at end of file diff --git a/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs b/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs @@ -382,6 +382,8 @@ namespace NetSharp.Raw.Stream /// <inheritdoc /> protected override void ResetStateObject(ref SocketAsyncEventArgs instance) { + instance.SetBuffer(null, 0, 0); + instance.AcceptSocket = null; } diff --git a/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkWriter.cs b/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkWriter.cs @@ -9,7 +9,7 @@ namespace NetSharp.Raw.Stream public sealed class RawStreamNetworkWriter : RawNetworkWriterBase { /// <inheritdoc /> - public RawStreamNetworkWriter(ref Socket rawConnection, EndPoint defaultEndPoint, int maxPooledMessageSize, int pooledBuffersPerBucket = 50, + public RawStreamNetworkWriter(ref Socket rawConnection, EndPoint defaultEndPoint, int maxPooledMessageSize = DefaultMaxPooledBufferSize, int pooledBuffersPerBucket = 50, uint preallocatedStateObjects = 0) : base(ref rawConnection, defaultEndPoint, maxPooledMessageSize, pooledBuffersPerBucket, preallocatedStateObjects) { if (maxPooledMessageSize <= 0) @@ -19,50 +19,6 @@ namespace NetSharp.Raw.Stream } } - private void CompleteConnect(SocketAsyncEventArgs args) - { - OperationToken token = (OperationToken) args.UserToken; - - switch (args.SocketError) - { - case SocketError.Success: - token.CompletionSource.SetResult(true); - break; - - case SocketError.OperationAborted: - token.CompletionSource.SetCanceled(); - break; - - default: - token.CompletionSource.SetException(new SocketException((int) args.SocketError)); - break; - } - - ArgsPool.Return(args); - } - - private void CompleteDisconnect(SocketAsyncEventArgs args) - { - OperationToken token = (OperationToken) args.UserToken; - - switch (args.SocketError) - { - case SocketError.Success: - token.CompletionSource.SetResult(true); - break; - - case SocketError.OperationAborted: - token.CompletionSource.SetCanceled(); - break; - - default: - token.CompletionSource.SetException(new SocketException((int) args.SocketError)); - break; - } - - ArgsPool.Return(args); - } - private void CompleteReceive(SocketAsyncEventArgs args) { PacketReadToken readToken = (PacketReadToken) args.UserToken; @@ -260,14 +216,6 @@ namespace NetSharp.Raw.Stream { switch (args.LastOperation) { - case SocketAsyncOperation.Connect: - CompleteConnect(args); - break; - - case SocketAsyncOperation.Disconnect: - CompleteDisconnect(args); - break; - case SocketAsyncOperation.Receive: CompleteReceive(args); break; @@ -325,58 +273,6 @@ namespace NetSharp.Raw.Stream { } - /// <inheritdoc /> - public override void Connect(EndPoint remoteEndPoint) - { - Connection.Connect(remoteEndPoint); - } - - /// <inheritdoc /> - public override ValueTask ConnectAsync(EndPoint remoteEndPoint) - { - TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); - SocketAsyncEventArgs args = ArgsPool.Rent(); - - args.RemoteEndPoint = remoteEndPoint; - - OperationToken token = new OperationToken(tcs); - args.UserToken = token; - - if (Connection.ConnectAsync(args)) - { - return new ValueTask(tcs.Task); - } - - ArgsPool.Return(args); - - return new ValueTask(); - } - - public void Disconnect(bool reuseSocket) - { - Connection.Disconnect(reuseSocket); - } - - public ValueTask DisconnectAsync(bool reuseSocket) - { - TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>(); - SocketAsyncEventArgs args = ArgsPool.Rent(); - - args.DisconnectReuseSocket = reuseSocket; - - OperationToken token = new OperationToken(tcs); - args.UserToken = token; - - if (Connection.DisconnectAsync(args)) - { - return new ValueTask(tcs.Task); - } - - ArgsPool.Return(args); - - return new ValueTask(); - } - public override int Read(ref EndPoint remoteEndPoint, Memory<byte> readBuffer, SocketFlags flags = SocketFlags.None) { static int ReadBytesIntoBuffer(Socket connection, ref byte[] buffer, int count, SocketFlags flags) diff --git a/NetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs b/NetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs @@ -10,15 +10,15 @@ using NetSharp.Raw.Datagram; namespace NetSharpExamples.Benchmarks.Datagram_Network_Connection_Benchmarks { - public class DatagramNetworkReaderBenchmark : INetSharpBenchmark + internal class DatagramNetworkReaderBenchmark : INetSharpBenchmark { private const int PacketSize = 8192, PacketCount = 1_000_000, ClientCount = 12; private double[] ClientBandwidths; - public static readonly EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Loopback, 0); - public static readonly Encoding ServerEncoding = Encoding.UTF8; - public static readonly EndPoint ServerEndPoint = new IPEndPoint(IPAddress.Loopback, 12370); + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; public static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(); diff --git a/NetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkWriterAsyncBenchmark.cs b/NetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkWriterAsyncBenchmark.cs @@ -9,14 +9,13 @@ using NetSharp.Raw.Datagram; namespace NetSharpExamples.Benchmarks.Datagram_Network_Connection_Benchmarks { - public class DatagramNetworkWriterAsyncBenchmark : INetSharpBenchmark + internal class DatagramNetworkWriterAsyncBenchmark : INetSharpBenchmark { private const int PacketSize = 8192, PacketCount = 1_000_000; - public static readonly EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Loopback, 0); - - public static readonly Encoding ServerEncoding = Encoding.UTF8; - public static readonly EndPoint ServerEndPoint = new IPEndPoint(IPAddress.Loopback, 12371); + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; public static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(); diff --git a/NetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkWriterSyncBenchmark.cs b/NetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkWriterSyncBenchmark.cs @@ -9,14 +9,13 @@ using NetSharp.Raw.Datagram; namespace NetSharpExamples.Benchmarks.Datagram_Network_Connection_Benchmarks { - public class DatagramNetworkWriterSyncBenchmark : INetSharpBenchmark + internal class DatagramNetworkWriterSyncBenchmark : INetSharpBenchmark { private const int PacketSize = 8192, PacketCount = 1_000_000; - public static readonly EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Loopback, 0); - - public static readonly Encoding ServerEncoding = Encoding.UTF8; - public static readonly EndPoint ServerEndPoint = new IPEndPoint(IPAddress.Loopback, 12372); + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; public static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(); diff --git a/NetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkReaderBenchmark.cs b/NetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkReaderBenchmark.cs @@ -10,15 +10,15 @@ using NetSharp.Raw.Stream; namespace NetSharpExamples.Benchmarks.Stream_Network_Connection_Benchmarks { - public class StreamNetworkReaderBenchmark : INetSharpBenchmark + internal class StreamNetworkReaderBenchmark : INetSharpBenchmark { private const int PacketSize = 8192, PacketCount = 1_000_000, ClientCount = 12; private double[] ClientBandwidths; - public static readonly EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Loopback, 0); - public static readonly Encoding ServerEncoding = Encoding.UTF8; - public static readonly EndPoint ServerEndPoint = new IPEndPoint(IPAddress.Loopback, 12373); + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; public static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(); diff --git a/NetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkWriterAsyncBenchmark.cs b/NetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkWriterAsyncBenchmark.cs @@ -9,14 +9,13 @@ using NetSharp.Raw.Stream; namespace NetSharpExamples.Benchmarks.Stream_Network_Connection_Benchmarks { - public class StreamNetworkWriterAsyncBenchmark : INetSharpBenchmark + internal class StreamNetworkWriterAsyncBenchmark : INetSharpBenchmark { private const int PacketSize = 8192, PacketCount = 1_000_000; - public static readonly EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Loopback, 0); - - public static readonly Encoding ServerEncoding = StreamNetworkReaderBenchmark.ServerEncoding; - public static readonly EndPoint ServerEndPoint = StreamNetworkReaderBenchmark.ServerEndPoint; + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; public static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(); diff --git a/NetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkWriterSyncBenchmark.cs b/NetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkWriterSyncBenchmark.cs @@ -9,14 +9,13 @@ using NetSharp.Raw.Stream; namespace NetSharpExamples.Benchmarks.Stream_Network_Connection_Benchmarks { - public class StreamNetworkWriterSyncBenchmark : INetSharpBenchmark + internal class StreamNetworkWriterSyncBenchmark : INetSharpBenchmark { private const int PacketSize = 8192, PacketCount = 1_000_000; - public static readonly EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Loopback, 0); - - public static readonly Encoding ServerEncoding = StreamNetworkReaderBenchmark.ServerEncoding; - public static readonly EndPoint ServerEndPoint = StreamNetworkReaderBenchmark.ServerEndPoint; + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; public static readonly ManualResetEventSlim ServerReadyEvent = new ManualResetEventSlim(); diff --git a/NetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs b/NetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs @@ -8,11 +8,12 @@ using NetSharp.Raw.Datagram; namespace NetSharpExamples.Examples.Datagram_Network_Connection_Examples { - public class DatagramNetworkReaderExample : INetSharpExample + internal class DatagramNetworkReaderExample : INetSharpExample { private const int PacketSize = 8192, ExpectedClientCount = 8; - public static readonly Encoding ServerEncoding = Encoding.UTF8; - public static readonly EndPoint ServerEndPoint = new IPEndPoint(IPAddress.Loopback, 12376); + + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Datagram Network Reader Example"; diff --git a/NetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkWriterAsyncExample.cs b/NetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkWriterAsyncExample.cs @@ -8,14 +8,13 @@ using NetSharp.Raw.Datagram; namespace NetSharpExamples.Examples.Datagram_Network_Connection_Examples { - public class DatagramNetworkWriterAsyncExample : INetSharpExample + internal class DatagramNetworkWriterAsyncExample : INetSharpExample { private const int PacketSize = 8192; - public static readonly EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Loopback, 0); - - public static readonly Encoding ServerEncoding = DatagramNetworkReaderExample.ServerEncoding; - public static readonly EndPoint ServerEndPoint = DatagramNetworkReaderExample.ServerEndPoint; + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Datagram Network Writer Example (Asynchronous)"; diff --git a/NetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkWriterSyncExample.cs b/NetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkWriterSyncExample.cs @@ -8,14 +8,13 @@ using NetSharp.Raw.Datagram; namespace NetSharpExamples.Examples.Datagram_Network_Connection_Examples { - public class DatagramNetworkWriterSyncExample : INetSharpExample + internal class DatagramNetworkWriterSyncExample : INetSharpExample { private const int PacketSize = 8192; - public static readonly EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Loopback, 0); - - public static readonly Encoding ServerEncoding = DatagramNetworkReaderExample.ServerEncoding; - public static readonly EndPoint ServerEndPoint = DatagramNetworkReaderExample.ServerEndPoint; + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Datagram Network Writer Example (Synchronous)"; diff --git a/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/RawStreamChatServer.cs b/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/RawStreamChatServer.cs @@ -0,0 +1,121 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +using NetSharp.Raw.Stream; + +namespace NetSharpExamples.Examples.Stream_Network_Connection_Examples +{ + internal class RawStreamChatServer : INetSharpExample + { + private static readonly int ChatPacketSize = 8192; + private static readonly EndPoint DefaultEndPoint = new IPEndPoint(IPAddress.Any, 0); + private static readonly ushort InitialClientCount = 4; + + private static readonly ManualResetEventSlim serverStartedEvent = new ManualResetEventSlim(false); + + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; + + public string Name => "Raw Stream Chat Server"; + + private static async Task ClientTask() + { + Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + clientSocket.Bind(ClientEndPoint); + clientSocket.Connect(ServerEndPoint); + + using RawStreamNetworkWriter client = new RawStreamNetworkWriter(ref clientSocket, DefaultEndPoint, ChatPacketSize); + + byte[] transmissionBuffer = new byte[ChatPacketSize]; + + try + { + while (true) + { + Console.Write("Enter string to send to the server: "); + string request = Console.ReadLine(); + if (!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); + + 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); + + string response = ServerEncoding.GetString(transmissionBuffer); + + Console.WriteLine($"[{clientSocket.LocalEndPoint}] Received {receivedBytes} bytes from server!"); + Console.WriteLine($"\t{response}"); + } + } + catch (Exception ex) + { + Console.WriteLine(ex); + } + finally + { + clientSocket.Shutdown(SocketShutdown.Both); + clientSocket.Disconnect(true); + + clientSocket.Close(); + clientSocket.Dispose(); + } + } + + private static bool ServerPacketHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, in Memory<byte> responseBuffer) + { + string request = ServerEncoding.GetString(requestBuffer.Span).Trim('\0'); + + Console.WriteLine($"[Server] Received request \'{request}\' from {remoteEndPoint}"); + Console.WriteLine($"[Server] Sending response \'{request}\' to {remoteEndPoint}"); + + return requestBuffer.TryCopyTo(responseBuffer); + } + + private static Task ServerTask() + { + Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + + serverSocket.Bind(ServerEndPoint); + serverSocket.Listen(InitialClientCount); + + 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}!"); + serverStartedEvent.Set(); + + while (true) + { + } + + server.Stop(); + + return Task.CompletedTask; + } + + public async Task RunAsync() + { + Task serverTask = Task.Factory.StartNew(ServerTask); + + serverStartedEvent.Wait(); + + await Task.Factory.StartNew(ClientTask).GetAwaiter().GetResult(); + } + } +} +\ No newline at end of file diff --git a/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs b/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs @@ -8,11 +8,12 @@ using NetSharp.Raw.Stream; namespace NetSharpExamples.Examples.Stream_Network_Connection_Examples { - public class StreamNetworkReaderExample : INetSharpExample + internal class StreamNetworkReaderExample : INetSharpExample { private const int PacketSize = 8192, ExpectedClientCount = 8; - public static readonly Encoding ServerEncoding = Encoding.UTF8; - public static readonly EndPoint ServerEndPoint = new IPEndPoint(IPAddress.Loopback, 12377); + + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Raw Stream Network Reader Example"; diff --git a/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkWriterAsyncExample.cs b/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkWriterAsyncExample.cs @@ -8,14 +8,13 @@ using NetSharp.Raw.Stream; namespace NetSharpExamples.Examples.Stream_Network_Connection_Examples { - public class StreamNetworkWriterAsyncExample : INetSharpExample + internal class StreamNetworkWriterAsyncExample : INetSharpExample { private const int PacketSize = 8192; - public static readonly EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Loopback, 0); - - public static readonly Encoding ServerEncoding = StreamNetworkReaderExample.ServerEncoding; - public static readonly EndPoint ServerEndPoint = StreamNetworkReaderExample.ServerEndPoint; + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Raw Stream Network Writer Example (Asynchronous)"; @@ -27,35 +26,45 @@ namespace NetSharpExamples.Examples.Stream_Network_Connection_Examples Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); rawSocket.Bind(ClientEndPoint); + rawSocket.Connect(ServerEndPoint); using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultEndPoint, PacketSize); - await writer.ConnectAsync(ServerEndPoint); byte[] transmissionBuffer = new byte[PacketSize]; EndPoint remoteEndPoint = ServerEndPoint; - while (true) + try { - int sent = await writer.WriteAsync(remoteEndPoint, transmissionBuffer); - - lock (typeof(Console)) + while (true) { - Console.WriteLine($"Sent {sent} bytes to {remoteEndPoint}!"); - } + int sent = await writer.WriteAsync(remoteEndPoint, transmissionBuffer); - int received = await writer.ReadAsync(remoteEndPoint, transmissionBuffer); + lock (typeof(Console)) + { + Console.WriteLine($"Sent {sent} bytes to {remoteEndPoint}!"); + } - lock (typeof(Console)) - { - Console.WriteLine($"Received {received} bytes from {remoteEndPoint}!"); + int received = await writer.ReadAsync(remoteEndPoint, transmissionBuffer); + + lock (typeof(Console)) + { + Console.WriteLine($"Received {received} bytes from {remoteEndPoint}!"); + } } } + catch (Exception ex) + { + Console.WriteLine(ex); + } + finally + { + rawSocket.Shutdown(SocketShutdown.Both); + rawSocket.Disconnect(true); - await writer.DisconnectAsync(false); - - rawSocket.Close(); - rawSocket.Dispose(); + rawSocket.Close(); + rawSocket.Dispose(); + } } } } \ No newline at end of file diff --git a/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkWriterSyncExample.cs b/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkWriterSyncExample.cs @@ -8,14 +8,13 @@ using NetSharp.Raw.Stream; namespace NetSharpExamples.Examples.Stream_Network_Connection_Examples { - public class StreamNetworkWriterSyncExample : INetSharpExample + internal class StreamNetworkWriterSyncExample : INetSharpExample { private const int PacketSize = 8192; - public static readonly EndPoint ClientEndPoint = new IPEndPoint(IPAddress.Loopback, 0); - - public static readonly Encoding ServerEncoding = StreamNetworkReaderExample.ServerEncoding; - public static readonly EndPoint ServerEndPoint = StreamNetworkReaderExample.ServerEndPoint; + public static readonly EndPoint ClientEndPoint = Program.DefaultClientEndPoint; + public static readonly Encoding ServerEncoding = Program.DefaultEncoding; + public static readonly EndPoint ServerEndPoint = Program.DefaultServerEndPoint; /// <inheritdoc /> public string Name { get; } = "Raw Stream Network Writer Example (Synchronous)"; @@ -27,35 +26,45 @@ namespace NetSharpExamples.Examples.Stream_Network_Connection_Examples Socket rawSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); rawSocket.Bind(ClientEndPoint); + rawSocket.Connect(ServerEndPoint); using RawStreamNetworkWriter writer = new RawStreamNetworkWriter(ref rawSocket, defaultEndPoint, PacketSize); - writer.Connect(ServerEndPoint); byte[] transmissionBuffer = new byte[PacketSize]; EndPoint remoteEndPoint = ServerEndPoint; - while (true) + try { - int sent = writer.Write(remoteEndPoint, transmissionBuffer); - - lock (typeof(Console)) + while (true) { - Console.WriteLine($"Sent {sent} bytes to {remoteEndPoint}!"); - } + int sent = writer.Write(remoteEndPoint, transmissionBuffer); - int received = writer.Read(ref remoteEndPoint, transmissionBuffer); + lock (typeof(Console)) + { + Console.WriteLine($"Sent {sent} bytes to {remoteEndPoint}!"); + } - lock (typeof(Console)) - { - Console.WriteLine($"Received {received} bytes from {remoteEndPoint}!"); + int received = writer.Read(ref remoteEndPoint, transmissionBuffer); + + lock (typeof(Console)) + { + Console.WriteLine($"Received {received} bytes from {remoteEndPoint}!"); + } } } + catch (Exception ex) + { + Console.WriteLine(ex); + } + finally + { + rawSocket.Shutdown(SocketShutdown.Both); + rawSocket.Disconnect(true); - writer.Disconnect(false); - - rawSocket.Close(); - rawSocket.Dispose(); + rawSocket.Close(); + rawSocket.Dispose(); + } return Task.CompletedTask; } diff --git a/NetSharp/NetSharpExamples/Program.cs b/NetSharp/NetSharpExamples/Program.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Net; using System.Reflection; +using System.Text; using System.Threading.Tasks; namespace NetSharpExamples @@ -8,8 +10,14 @@ namespace NetSharpExamples internal class Program { private static readonly List<INetSharpBenchmark> Benchmarks; + private static readonly IPAddress DefaultExampleAddress = IPAddress.Loopback; + private static readonly int DefaultExamplePort = 44230; 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() { Examples = new List<INetSharpExample>();