NetSharp

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

commit 61097661f55df5198481fcd4cb7985a2359b58e4
parent 633d5c8c0912fb81260ffe39230be7f727dee883
Author: Mikolaj Lenczewski <mikolaj.lenczewski308@gmail.com>
Date:   Thu, 11 Jun 2020 22:50:13 +0100

Satisfied the FxCop Code Analyser.

Diffstat:
MNetSharp/NetSharp/INetworkReader.cs | 4++--
MNetSharp/NetSharp/NetSharp.csproj | 21++++++++++++---------
MNetSharp/NetSharp/NetSharp.xml | 2+-
MNetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkWriter.cs | 8++++----
MNetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs | 43++++++++++++++++++++++++++++---------------
MNetSharp/NetSharp/Raw/RawNetworkReaderBase.cs | 9+++++----
MNetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs | 2+-
MNetSharp/NetSharp/Raw/Stream/RawStreamNetworkWriter.cs | 22+++++++++++-----------
MNetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs | 2+-
MNetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkReaderBenchmark.cs | 2+-
MNetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs | 2+-
MNetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/RawStreamChatServer.cs | 2+-
MNetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs | 2+-
MNetSharp/NetSharpExamples/NetSharpExamples.csproj | 1+
14 files changed, 70 insertions(+), 52 deletions(-)

diff --git a/NetSharp/NetSharp/INetworkReader.cs b/NetSharp/NetSharp/INetworkReader.cs @@ -2,8 +2,8 @@ { public interface INetworkReader { - public void Start(ushort concurrentReadTasks); + public void Shutdown(); - public void Stop(); + public void Start(ushort concurrentTasks); } } \ No newline at end of file diff --git a/NetSharp/NetSharp/NetSharp.csproj b/NetSharp/NetSharp/NetSharp.csproj @@ -3,18 +3,22 @@ <PropertyGroup> <Nullable>enable</Nullable> <TargetFramework>netstandard2.1</TargetFramework> + <Configurations>Debug;Release</Configurations> + </PropertyGroup> + + <PropertyGroup> <GeneratePackageOnBuild>true</GeneratePackageOnBuild> <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance> <NeutralLanguage>en</NeutralLanguage> <Authors>MikoĊ‚aj Lenczewski</Authors> <Company>NetSharp</Company> - <Version>0.1.0</Version> + <Version>0.1.1</Version> <PackageLicenseFile>LICENSE</PackageLicenseFile> <PackageProjectUrl>https://github.com/EnderRifter/NetSharp</PackageProjectUrl> <Description>A networking library for C#, focusing on performance and built on top of SocketAsyncEventArgs.</Description> - </PropertyGroup> - - <PropertyGroup> + <RepositoryUrl>https://github.com/EnderRifter/NetSharp.git</RepositoryUrl> + <RepositoryType>git</RepositoryType> + <PackageTags>networking</PackageTags> <IncludeSymbols>true</IncludeSymbols> <SymbolPackageFormat>snupkg</SymbolPackageFormat> </PropertyGroup> @@ -31,12 +35,11 @@ </PropertyGroup> <ItemGroup> - <None Remove="Utils\Conversion\EndianAwareBitConverter.cs~RF33e825.TMP" /> - </ItemGroup> - - <ItemGroup> + <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.0.0"> + <PrivateAssets>all</PrivateAssets> + <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> + </PackageReference> <PackageReference Include="Microsoft.CSharp" Version="4.7.0" /> - <PackageReference Include="Microsoft.Extensions.ObjectPool" Version="3.1.5" /> </ItemGroup> <ItemGroup> diff --git a/NetSharp/NetSharp/NetSharp.xml b/NetSharp/NetSharp/NetSharp.xml @@ -66,7 +66,7 @@ <member name="M:NetSharp.Raw.RawNetworkReaderBase.Start(System.UInt16)"> <inheritdoc /> </member> - <member name="M:NetSharp.Raw.RawNetworkReaderBase.Stop"> + <member name="M:NetSharp.Raw.RawNetworkReaderBase.Shutdown"> <inheritdoc /> </member> <member name="M:NetSharp.Raw.RawNetworkWriterBase.#ctor(System.Net.Sockets.Socket@,System.Net.EndPoint,System.Int32,System.Int32,System.UInt32)"> diff --git a/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkWriter.cs b/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkWriter.cs @@ -124,7 +124,7 @@ namespace NetSharp.Raw.Datagram { throw new ArgumentException( $"Cannot rent a temporary buffer of size: {totalBytes} bytes; maximum temporary buffer size: {datagramSize} bytes", - nameof(readBuffer.Length) + nameof(readBuffer) ); } @@ -146,7 +146,7 @@ namespace NetSharp.Raw.Datagram { throw new ArgumentException( $"Cannot rent a temporary buffer of size: {totalBytes} bytes; maximum temporary buffer size: {datagramSize} bytes", - nameof(readBuffer.Length) + nameof(readBuffer) ); } @@ -187,7 +187,7 @@ namespace NetSharp.Raw.Datagram { throw new ArgumentException( $"Cannot rent a temporary buffer of size: {totalBytes} bytes; maximum temporary buffer size: {datagramSize} bytes", - nameof(writeBuffer.Length) + nameof(writeBuffer) ); } @@ -209,7 +209,7 @@ namespace NetSharp.Raw.Datagram { throw new ArgumentException( $"Cannot rent a temporary buffer of size: {totalBytes} bytes; maximum temporary buffer size: {datagramSize} bytes", - nameof(writeBuffer.Length) + nameof(writeBuffer) ); } diff --git a/NetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs b/NetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs @@ -10,42 +10,55 @@ namespace NetSharp.Raw { public abstract class RawNetworkConnectionBase : IDisposable { + private readonly SlimObjectPool<SocketAsyncEventArgs> argsPool; + + private readonly ArrayPool<byte> bufferPool; + + private readonly Socket connection; + + private readonly EndPoint defaultEndPoint; + // https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/Buffers/ConfigurableArrayPool.cs protected const int DefaultMaxPooledBufferSize = 1024 * 1024, DefaultMaxPooledBuffersPerBucket = 50; - protected readonly SlimObjectPool<SocketAsyncEventArgs> ArgsPool; - protected readonly ArrayPool<byte> BufferPool; - protected readonly Socket Connection; - protected readonly EndPoint DefaultEndPoint; - protected RawNetworkConnectionBase(ref Socket rawConnection, EndPoint defaultEndPoint, int maxPooledBufferSize, int pooledBuffersPerBucket = 50, uint preallocatedStateObjects = 0) { - Connection = rawConnection; + connection = rawConnection; - BufferPool = maxPooledBufferSize <= DefaultMaxPooledBufferSize && pooledBuffersPerBucket <= DefaultMaxPooledBuffersPerBucket + bufferPool = maxPooledBufferSize <= DefaultMaxPooledBufferSize && pooledBuffersPerBucket <= DefaultMaxPooledBuffersPerBucket ? ArrayPool<byte>.Shared - : BufferPool = ArrayPool<byte>.Create(maxPooledBufferSize, pooledBuffersPerBucket); + : ArrayPool<byte>.Create(maxPooledBufferSize, pooledBuffersPerBucket); - DefaultEndPoint = defaultEndPoint; + this.defaultEndPoint = defaultEndPoint; - ArgsPool = - new SlimObjectPool<SocketAsyncEventArgs>(CreateStateObject, ResetStateObject, DestroyStateObject, CanReuseStateObject); + argsPool = new SlimObjectPool<SocketAsyncEventArgs>(CreateStateObject, ResetStateObject, DestroyStateObject, CanReuseStateObject); // TODO implement pooling in better way for (uint i = 0; i < preallocatedStateObjects; i++) { - ArgsPool.Return(CreateStateObject()); + argsPool.Return(CreateStateObject()); } } + protected ref readonly SlimObjectPool<SocketAsyncEventArgs> ArgsPool => ref argsPool; + + protected ref readonly ArrayPool<byte> BufferPool => ref bufferPool; + + protected ref readonly Socket Connection => ref connection; + + protected ref readonly EndPoint DefaultEndPoint => ref defaultEndPoint; + protected abstract bool CanReuseStateObject(ref SocketAsyncEventArgs instance); [MethodImpl(MethodImplOptions.AggressiveInlining)] protected void CleanupTransmissionBufferAndState(SocketAsyncEventArgs args) { - BufferPool.Return(args.Buffer, true); - ArgsPool.Return(args); + if (args != default) + { + bufferPool.Return(args.Buffer, true); + argsPool.Return(args); + } } protected abstract SocketAsyncEventArgs CreateStateObject(); @@ -62,7 +75,7 @@ namespace NetSharp.Raw return; } - ArgsPool.Dispose(); + argsPool.Dispose(); } protected abstract void ResetStateObject(ref SocketAsyncEventArgs instance); diff --git a/NetSharp/NetSharp/Raw/RawNetworkReaderBase.cs b/NetSharp/NetSharp/Raw/RawNetworkReaderBase.cs @@ -6,18 +6,19 @@ namespace NetSharp.Raw { public abstract class RawNetworkReaderBase : RawNetworkConnectionBase, INetworkReader { + private readonly CancellationToken shutdownToken; private readonly CancellationTokenSource shutdownTokenSource; - protected readonly CancellationToken ShutdownToken; - /// <inheritdoc /> private protected RawNetworkReaderBase(ref Socket rawConnection, EndPoint defaultEndPoint, int maxPooledBufferSize, int pooledBuffersPerBucket = 50, uint preallocatedStateObjects = 0) : base(ref rawConnection, defaultEndPoint, maxPooledBufferSize, pooledBuffersPerBucket, preallocatedStateObjects) { shutdownTokenSource = new CancellationTokenSource(); - ShutdownToken = shutdownTokenSource.Token; + shutdownToken = shutdownTokenSource.Token; } + protected ref readonly CancellationToken ShutdownToken => ref shutdownToken; + /// <inheritdoc /> protected override void Dispose(bool disposing) { @@ -36,7 +37,7 @@ namespace NetSharp.Raw public abstract void Start(ushort concurrentReadTasks); /// <inheritdoc /> - public void Stop() + public void Shutdown() { shutdownTokenSource.Cancel(); } diff --git a/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs b/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs @@ -21,7 +21,7 @@ namespace NetSharp.Raw.Stream if (maxPooledMessageSize <= 0) { throw new ArgumentOutOfRangeException(nameof(maxPooledMessageSize), maxPooledMessageSize, - $"The maximum message size must be greater than 0"); + "The maximum message size must be greater than 0"); } RequestHandler = requestHandler ?? DefaultRequestHandler; diff --git a/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkWriter.cs b/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkWriter.cs @@ -16,10 +16,20 @@ namespace NetSharp.Raw.Stream if (maxPooledMessageSize <= 0) { throw new ArgumentOutOfRangeException(nameof(maxPooledMessageSize), maxPooledMessageSize, - $"The message size must be greater than 0"); + "The message size must be greater than 0"); } } + private static void ConfigureAsyncSendPacket(SocketAsyncEventArgs args, ref byte[] pendingPacketBuffer, in RawStreamPacketHeader pendingPacketHeader, + in ReadOnlyMemory<byte> userDataBuffer, TaskCompletionSource<int> tcs) + { + RawStreamPacket.Serialise(pendingPacketBuffer, in pendingPacketHeader, in userDataBuffer); + + int totalPacketSize = RawStreamPacket.TotalPacketSize(in pendingPacketHeader); + args.SetBuffer(pendingPacketBuffer, 0, totalPacketSize); + args.UserToken = new PacketWriteToken(totalPacketSize, tcs); + } + private void CompleteReceive(SocketAsyncEventArgs args) { PacketReadToken readToken = (PacketReadToken) args.UserToken; @@ -183,16 +193,6 @@ namespace NetSharp.Raw.Stream args.UserToken = new PacketReadToken(RawStreamPacketHeader.TotalSize, null, in userDataBuffer, tcs); } - private void ConfigureAsyncSendPacket(SocketAsyncEventArgs args, ref byte[] pendingPacketBuffer, in RawStreamPacketHeader pendingPacketHeader, - in ReadOnlyMemory<byte> userDataBuffer, TaskCompletionSource<int> tcs) - { - RawStreamPacket.Serialise(pendingPacketBuffer, in pendingPacketHeader, in userDataBuffer); - - int totalPacketSize = RawStreamPacket.TotalPacketSize(in pendingPacketHeader); - args.SetBuffer(pendingPacketBuffer, 0, totalPacketSize); - args.UserToken = new PacketWriteToken(totalPacketSize, tcs); - } - private void ContinueReceive(SocketAsyncEventArgs args) { if (Connection.ReceiveAsync(args)) diff --git a/NetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs b/NetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs @@ -109,7 +109,7 @@ namespace NetSharpExamples.Benchmarks.Datagram_Network_Connection_Benchmarks Console.WriteLine($"Total estimated bandwidth: {ClientBandwidths.Sum():F3}"); - reader.Stop(); + reader.Shutdown(); rawSocket.Close(); rawSocket.Dispose(); diff --git a/NetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkReaderBenchmark.cs b/NetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkReaderBenchmark.cs @@ -133,7 +133,7 @@ namespace NetSharpExamples.Benchmarks.Stream_Network_Connection_Benchmarks Console.WriteLine($"Total estimated bandwidth: {ClientBandwidths.Sum():F3}"); - reader.Stop(); + reader.Shutdown(); rawSocket.Close(); rawSocket.Dispose(); diff --git a/NetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs b/NetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs @@ -44,7 +44,7 @@ namespace NetSharpExamples.Examples.Datagram_Network_Connection_Examples Console.WriteLine($"Started datagram server at {ServerEndPoint}! Enter any key to stop the server..."); Console.ReadLine(); - reader.Stop(); + reader.Shutdown(); rawSocket.Close(); rawSocket.Dispose(); diff --git a/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/RawStreamChatServer.cs b/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/RawStreamChatServer.cs @@ -102,7 +102,7 @@ namespace NetSharpExamples.Examples.Stream_Network_Connection_Examples { } - server.Stop(); + server.Shutdown(); return Task.CompletedTask; } diff --git a/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs b/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs @@ -45,7 +45,7 @@ namespace NetSharpExamples.Examples.Stream_Network_Connection_Examples Console.WriteLine($"Started stream server at {ServerEndPoint}! Enter any key to stop the server..."); Console.ReadLine(); - reader.Stop(); + reader.Shutdown(); rawSocket.Close(); rawSocket.Dispose(); diff --git a/NetSharp/NetSharpExamples/NetSharpExamples.csproj b/NetSharp/NetSharpExamples/NetSharpExamples.csproj @@ -3,6 +3,7 @@ <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp3.1</TargetFramework> + <Configurations>Debug;Release</Configurations> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">