NetSharp

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

commit 619fe922791472720dc8a7168a81abdb0262a73d
parent d283d37a375f07512566c4ba5196bcb91a55c33b
Author: Mikolaj Lenczewski <mikolaj.lenczewski308@gmail.com>
Date:   Wed, 24 Jun 2020 11:38:14 +0100

Added new localisable error message, and added xml doc comments to entire public API.

Diffstat:
DNetSharp/NetSharp/Interfaces/INetworkReader.cs | 10----------
DNetSharp/NetSharp/Interfaces/INetworkWriter.cs | 23-----------------------
ANetSharp/NetSharp/Interfaces/IRawNetworkReader.cs | 23+++++++++++++++++++++++
ANetSharp/NetSharp/Interfaces/IRawNetworkWriter.cs | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
MNetSharp/NetSharp/NetSharp.xml | 346+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
MNetSharp/NetSharp/Packets/RawStreamPacket.cs | 90++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
MNetSharp/NetSharp/Properties/Resources.Designer.cs | 9+++++++++
MNetSharp/NetSharp/Properties/Resources.pl-PL.resx | 3+++
MNetSharp/NetSharp/Properties/Resources.resx | 3+++
MNetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkReader.cs | 22++++++++++++++++++++++
MNetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkWriter.cs | 15++++++++++-----
MNetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
MNetSharp/NetSharp/Raw/RawNetworkReaderBase.cs | 14++++++++++----
MNetSharp/NetSharp/Raw/RawNetworkWriterBase.cs | 5++++-
MNetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs | 22++++++++++++++++++++++
MNetSharp/NetSharp/Raw/Stream/RawStreamNetworkWriter.cs | 7+++++++
MNetSharp/NetSharp/Utils/SlimObjectPool.cs | 8++++----
17 files changed, 670 insertions(+), 73 deletions(-)

diff --git a/NetSharp/NetSharp/Interfaces/INetworkReader.cs b/NetSharp/NetSharp/Interfaces/INetworkReader.cs @@ -1,9 +0,0 @@ -namespace NetSharp.Interfaces -{ - public interface INetworkReader - { - public void Shutdown(); - - public void Start(ushort concurrentTasks); - } -} -\ No newline at end of file diff --git a/NetSharp/NetSharp/Interfaces/INetworkWriter.cs b/NetSharp/NetSharp/Interfaces/INetworkWriter.cs @@ -1,22 +0,0 @@ -using System; -using System.Net; -using System.Net.Sockets; -using System.Threading.Tasks; - -namespace NetSharp.Interfaces -{ - public interface INetworkWriter - { - public int Read(ref EndPoint remoteEndPoint, Memory<byte> readBuffer, - SocketFlags flags = SocketFlags.None); - - public ValueTask<int> ReadAsync(EndPoint remoteEndPoint, Memory<byte> readBuffer, - SocketFlags flags = SocketFlags.None); - - public int Write(EndPoint remoteEndPoint, ReadOnlyMemory<byte> writeBuffer, - SocketFlags flags = SocketFlags.None); - - public ValueTask<int> WriteAsync(EndPoint remoteEndPoint, ReadOnlyMemory<byte> writeBuffer, - SocketFlags flags = SocketFlags.None); - } -} -\ No newline at end of file diff --git a/NetSharp/NetSharp/Interfaces/IRawNetworkReader.cs b/NetSharp/NetSharp/Interfaces/IRawNetworkReader.cs @@ -0,0 +1,22 @@ +namespace NetSharp.Interfaces +{ + /// <summary> + /// Describes the methods and properties that a raw network reader (i.e. binary server) must implement. + /// </summary> + public interface IRawNetworkReader + { + /// <summary> + /// Stops queuing up new asynchronous read operations. Does not terminate existing asynchronous operations; the underlying socket must be + /// terminated to cancel all current 'in-flight' asynchronous operations. + /// </summary> + public void Shutdown(); + + /// <summary> + /// Queues up <paramref name="concurrentTasks" /> new asynchronous read operations. + /// </summary> + /// <param name="concurrentTasks"> + /// The number of asynchronous read operation to queue up. + /// </param> + public void Start(ushort concurrentTasks); + } +} +\ No newline at end of file diff --git a/NetSharp/NetSharp/Interfaces/IRawNetworkWriter.cs b/NetSharp/NetSharp/Interfaces/IRawNetworkWriter.cs @@ -0,0 +1,83 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading.Tasks; + +namespace NetSharp.Interfaces +{ + /// <summary> + /// Describes the methods and properties that a raw network writer (i.e. binary client) must implement. + /// </summary> + public interface IRawNetworkWriter + { + /// <summary> + /// Reads bytes from the network until either the given <paramref name="readBuffer" /> is filled, or a single datagram has been received. + /// </summary> + /// <param name="remoteEndPoint"> + /// The remote endpoint from which to receive bytes. Ignored for stream connections, where the connected socket's remote endpoint is used instead. + /// </param> + /// <param name="readBuffer"> + /// The buffer into which to place any received bytes. + /// </param> + /// <param name="flags"> + /// The <see cref="SocketFlags" /> associated with the network operation. + /// </param> + /// <returns> + /// The number of bytes of data read from the remote connection. + /// </returns> + public int Read(ref EndPoint remoteEndPoint, Memory<byte> readBuffer, SocketFlags flags = SocketFlags.None); + + /// <summary> + /// Asynchronously reads bytes from the network until either the given <paramref name="readBuffer" /> is filled, or a single datagram has been received. + /// </summary> + /// <param name="remoteEndPoint"> + /// The remote endpoint from which to receive bytes. Ignored for stream connections, where the connected socket's remote endpoint is used instead. + /// </param> + /// <param name="readBuffer"> + /// The buffer into which to place any received bytes. + /// </param> + /// <param name="flags"> + /// The <see cref="SocketFlags" /> associated with the network operation. + /// </param> + /// <returns> + /// The number of bytes of data read from the remote connection. + /// </returns> + public ValueTask<int> ReadAsync(EndPoint remoteEndPoint, Memory<byte> readBuffer, SocketFlags flags = SocketFlags.None); + + /// <summary> + /// Writes bytes in the given <paramref name="writeBuffer" /> to the network. If using a datagram connection, make sure that the + /// <paramref name="writeBuffer" /> size doesn't exceed the max datagram size for that transport. + /// </summary> + /// <param name="remoteEndPoint"> + /// The remote endpoint to which to send bytes. Ignored for stream connections, where the connected socket's remote endpoint is used instead. + /// </param> + /// <param name="writeBuffer"> + /// The buffer whose contents to send. + /// </param> + /// <param name="flags"> + /// The <see cref="SocketFlags" /> associated with the network operation. + /// </param> + /// <returns> + /// The number of bytes of data sent to the remote endpoint. + /// </returns> + public int Write(EndPoint remoteEndPoint, ReadOnlyMemory<byte> writeBuffer, SocketFlags flags = SocketFlags.None); + + /// <summary> + /// Asynchronously writes bytes in the given <paramref name="writeBuffer" /> to the network. If using a datagram connection, make sure that + /// the <paramref name="writeBuffer" /> size doesn't exceed the max datagram size for that transport. + /// </summary> + /// <param name="remoteEndPoint"> + /// The remote endpoint to which to send bytes. Ignored for stream connections, where the connected socket's remote endpoint is used instead. + /// </param> + /// <param name="writeBuffer"> + /// The buffer whose contents to send. + /// </param> + /// <param name="flags"> + /// The <see cref="SocketFlags" /> associated with the network operation. + /// </param> + /// <returns> + /// The number of bytes of data sent to the remote endpoint. + /// </returns> + public ValueTask<int> WriteAsync(EndPoint remoteEndPoint, ReadOnlyMemory<byte> writeBuffer, SocketFlags flags = SocketFlags.None); + } +} +\ No newline at end of file diff --git a/NetSharp/NetSharp/NetSharp.xml b/NetSharp/NetSharp/NetSharp.xml @@ -4,6 +4,173 @@ <name>NetSharp</name> </assembly> <members> + <member name="T:NetSharp.Interfaces.IRawNetworkReader"> + <summary> + Describes the methods and properties that a raw network reader (i.e. binary server) must implement. + </summary> + </member> + <member name="M:NetSharp.Interfaces.IRawNetworkReader.Shutdown"> + <summary> + Stops queuing up new asynchronous read operations. Does not terminate existing asynchronous operations; the underlying socket must be + terminated to cancel all current 'in-flight' asynchronous operations. + </summary> + </member> + <member name="M:NetSharp.Interfaces.IRawNetworkReader.Start(System.UInt16)"> + <summary> + Queues up <paramref name="concurrentTasks" /> new asynchronous read operations. + </summary> + <param name="concurrentTasks"> + The number of asynchronous read operation to queue up. + </param> + </member> + <member name="T:NetSharp.Interfaces.IRawNetworkWriter"> + <summary> + Describes the methods and properties that a raw network writer (i.e. binary client) must implement. + </summary> + </member> + <member name="M:NetSharp.Interfaces.IRawNetworkWriter.Read(System.Net.EndPoint@,System.Memory{System.Byte},System.Net.Sockets.SocketFlags)"> + <summary> + Reads bytes from the network until either the given <paramref name="readBuffer" /> is filled, or a single datagram has been received. + </summary> + <param name="remoteEndPoint"> + The remote endpoint from which to receive bytes. Ignored for stream connections, where the connected socket's remote endpoint is used instead. + </param> + <param name="readBuffer"> + The buffer into which to place any received bytes. + </param> + <param name="flags"> + The <see cref="T:System.Net.Sockets.SocketFlags" /> associated with the network operation. + </param> + <returns> + The number of bytes of data read from the remote connection. + </returns> + </member> + <member name="M:NetSharp.Interfaces.IRawNetworkWriter.ReadAsync(System.Net.EndPoint,System.Memory{System.Byte},System.Net.Sockets.SocketFlags)"> + <summary> + Asynchronously reads bytes from the network until either the given <paramref name="readBuffer" /> is filled, or a single datagram has been received. + </summary> + <param name="remoteEndPoint"> + The remote endpoint from which to receive bytes. Ignored for stream connections, where the connected socket's remote endpoint is used instead. + </param> + <param name="readBuffer"> + The buffer into which to place any received bytes. + </param> + <param name="flags"> + The <see cref="T:System.Net.Sockets.SocketFlags" /> associated with the network operation. + </param> + <returns> + The number of bytes of data read from the remote connection. + </returns> + </member> + <member name="M:NetSharp.Interfaces.IRawNetworkWriter.Write(System.Net.EndPoint,System.ReadOnlyMemory{System.Byte},System.Net.Sockets.SocketFlags)"> + <summary> + Writes bytes in the given <paramref name="writeBuffer" /> to the network. If using a datagram connection, make sure that the + <paramref name="writeBuffer" /> size doesn't exceed the max datagram size for that transport. + </summary> + <param name="remoteEndPoint"> + The remote endpoint to which to send bytes. Ignored for stream connections, where the connected socket's remote endpoint is used instead. + </param> + <param name="writeBuffer"> + The buffer whose contents to send. + </param> + <param name="flags"> + The <see cref="T:System.Net.Sockets.SocketFlags" /> associated with the network operation. + </param> + <returns> + The number of bytes of data sent to the remote endpoint. + </returns> + </member> + <member name="M:NetSharp.Interfaces.IRawNetworkWriter.WriteAsync(System.Net.EndPoint,System.ReadOnlyMemory{System.Byte},System.Net.Sockets.SocketFlags)"> + <summary> + Asynchronously writes bytes in the given <paramref name="writeBuffer" /> to the network. If using a datagram connection, make sure that + the <paramref name="writeBuffer" /> size doesn't exceed the max datagram size for that transport. + </summary> + <param name="remoteEndPoint"> + The remote endpoint to which to send bytes. Ignored for stream connections, where the connected socket's remote endpoint is used instead. + </param> + <param name="writeBuffer"> + The buffer whose contents to send. + </param> + <param name="flags"> + The <see cref="T:System.Net.Sockets.SocketFlags" /> associated with the network operation. + </param> + <returns> + The number of bytes of data sent to the remote endpoint. + </returns> + </member> + <member name="T:NetSharp.Packets.RawStreamPacketHeader"> + <summary> + Holds metadata about a raw stream packet. + </summary> + </member> + <member name="F:NetSharp.Packets.RawStreamPacketHeader.TotalSize"> + <summary> + The total size of the header in bytes. + </summary> + </member> + <member name="F:NetSharp.Packets.RawStreamPacketHeader.DataSize"> + <summary> + The size of the user supplied data segment in bytes. + </summary> + </member> + <member name="M:NetSharp.Packets.RawStreamPacketHeader.#ctor(System.Int32)"> + <summary> + Constructs a new instance of the <see cref="T:NetSharp.Packets.RawStreamPacketHeader" /> struct. + </summary> + <param name="dataSize"> + The size of the user supplied data segment. + </param> + </member> + <member name="M:NetSharp.Packets.RawStreamPacketHeader.Deserialise(System.Memory{System.Byte}@)"> + <summary> + Deserialises a <see cref="T:NetSharp.Packets.RawStreamPacketHeader" /> instance from the given <paramref name="buffer" />. + </summary> + <param name="buffer"> + A buffer containing a serialised <see cref="T:NetSharp.Packets.RawStreamPacketHeader" /> instance. Must be at least of size <see cref="F:NetSharp.Packets.RawStreamPacketHeader.TotalSize" />. + </param> + <returns> + The deserialised instance. + </returns> + </member> + <member name="M:NetSharp.Packets.RawStreamPacketHeader.Serialise(System.Memory{System.Byte}@)"> + <summary> + Serialises the current <see cref="T:NetSharp.Packets.RawStreamPacketHeader" /> instance into the given <paramref name="buffer" />. + </summary> + <param name="buffer"> + The buffer into which to serialise the current instance. Must be at least of size <see cref="F:NetSharp.Packets.RawStreamPacketHeader.TotalSize" />. + </param> + </member> + <member name="T:NetSharp.Packets.RawStreamPacket"> + <summary> + Provides helper methods to manipulate the binary packet format used by stream network handlers. + </summary> + </member> + <member name="M:NetSharp.Packets.RawStreamPacket.Serialise(System.Memory{System.Byte}@,NetSharp.Packets.RawStreamPacketHeader@,System.ReadOnlyMemory{System.Byte}@)"> + <summary> + Serialises the given <paramref name="packetHeader" /> and <paramref name="packetData" /> into the given <paramref name="buffer" />. + </summary> + <param name="buffer"> + The buffer into which the packet should be serialised. Must be at least of size <see cref="F:NetSharp.Packets.RawStreamPacketHeader.TotalSize" /> + the size + of the user data given by <paramref name="packetHeader" />. + </param> + <param name="packetHeader"> + The header containing metatdata abut the raw stream packet. + </param> + <param name="packetData"> + The user data held in the raw stream packet. + </param> + </member> + <member name="M:NetSharp.Packets.RawStreamPacket.TotalPacketSize(NetSharp.Packets.RawStreamPacketHeader@)"> + <summary> + Calculates the total size of a raw stream packet, using the packet data size in the given <paramref name="packetHeader" />. + </summary> + <param name="packetHeader"> + The header for which to calculate the total packet size. + </param> + <returns> + The total size of a raw stream packet with the given <paramref name="packetHeader" />. + </returns> + </member> <member name="T:NetSharp.Properties.Resources"> <summary> A strongly-typed resource class, for looking up localized strings, etc. @@ -30,6 +197,31 @@ Looks up a localized string similar to The maximum pooled message size must be greater than 0 bytes. </summary> </member> + <member name="T:NetSharp.Raw.Datagram.RawDatagramRequestHandler"> + <summary> + Represents a method that handles a request received by a <see cref="T:NetSharp.Raw.Datagram.RawDatagramNetworkReader" />. + </summary> + <param name="remoteEndPoint"> + The remote endpoint from which the request was received. + </param> + <param name="requestBuffer"> + The buffer containing the received request. + </param> + <param name="receivedRequestBytes"> + The number of bytes of user data received in the request. + </param> + <param name="responseBuffer"> + The buffer into which the response should be written. + </param> + <returns> + Whether there exists a response to be sent back to the remote endpoint. + </returns> + </member> + <member name="T:NetSharp.Raw.Datagram.RawDatagramNetworkReader"> + <summary> + Implements a raw network reader using a datagram-based protocol. + </summary> + </member> <member name="M:NetSharp.Raw.Datagram.RawDatagramNetworkReader.#ctor(System.Net.Sockets.Socket@,NetSharp.Raw.Datagram.RawDatagramRequestHandler,System.Net.EndPoint,System.Int32,System.Int32,System.UInt32)"> <inheritdoc /> </member> @@ -48,6 +240,11 @@ <member name="M:NetSharp.Raw.Datagram.RawDatagramNetworkReader.Start(System.UInt16)"> <inheritdoc /> </member> + <member name="T:NetSharp.Raw.Datagram.RawDatagramNetworkWriter"> + <summary> + Implements a raw network writer using a datagram-based protocol. + </summary> + </member> <member name="M:NetSharp.Raw.Datagram.RawDatagramNetworkWriter.#ctor(System.Net.Sockets.Socket@,System.Net.EndPoint,System.Int32,System.Int32,System.UInt32)"> <inheritdoc /> </member> @@ -75,26 +272,123 @@ <member name="M:NetSharp.Raw.Datagram.RawDatagramNetworkWriter.WriteAsync(System.Net.EndPoint,System.ReadOnlyMemory{System.Byte},System.Net.Sockets.SocketFlags)"> <inheritdoc /> </member> + <member name="T:NetSharp.Raw.RawNetworkConnectionBase"> + <summary> + Defines fields and methods common to all network connections. + </summary> + </member> + <member name="F:NetSharp.Raw.RawNetworkConnectionBase.DefaultMaxPooledBufferSize"> + <summary> + The maximum size of a pooled buffer that can be used with the <see cref="P:System.Buffers.ArrayPool`1.Shared" /> property, before a new custom pool must + be created. Taken from: https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/Buffers/ConfigurableArrayPool.cs + </summary> + </member> + <member name="F:NetSharp.Raw.RawNetworkConnectionBase.DefaultMaxPooledBuffersPerBucket"> + <summary> + The maximum number of pooled buffers per bucket that can be used with the <see cref="P:System.Buffers.ArrayPool`1.Shared" /> property, before a new custom + pool must be created. Taken from: https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/Buffers/ConfigurableArrayPool.cs + </summary> + </member> + <member name="F:NetSharp.Raw.RawNetworkConnectionBase.MaxDatagramSize"> + <summary> + The maximum size that a user supplied data buffer can be to fit into a UDP datagram. + </summary> + </member> + <member name="M:NetSharp.Raw.RawNetworkConnectionBase.#ctor(System.Net.Sockets.Socket@,System.Net.EndPoint,System.Int32,System.Int32,System.UInt32)"> + <summary> + Constructs a new instance of the <see cref="T:NetSharp.Raw.RawNetworkConnectionBase" /> class. + </summary> + <param name="rawConnection"> + The underlying <see cref="T:System.Net.Sockets.Socket" /> to use for the connection. + </param> + <param name="defaultEndPoint"> + The default endpoint to use to represent remote clients. + </param> + <param name="maxPooledBufferSize"> + The maximum size of a pooled buffer. + </param> + <param name="pooledBuffersPerBucket"> + The number of pooled buffers to hold in a single pool bucket. + </param> + <param name="preallocatedStateObjects"> + The number of state objects to preallocate. + </param> + </member> + <member name="P:NetSharp.Raw.RawNetworkConnectionBase.ArgsPool"> + <summary> + The object pool to use to pool <see cref="T:System.Net.Sockets.SocketAsyncEventArgs" /> instances. + </summary> + </member> + <member name="P:NetSharp.Raw.RawNetworkConnectionBase.BufferPool"> + <summary> + The object pool to use to pool byte buffer instance + </summary> + </member> + <member name="P:NetSharp.Raw.RawNetworkConnectionBase.Connection"> + <summary> + The underlying connection socket. + </summary> + </member> + <member name="P:NetSharp.Raw.RawNetworkConnectionBase.DefaultEndPoint"> + <summary> + The default endpoint to use to represent remote clients. + </summary> + </member> + <member name="M:NetSharp.Raw.RawNetworkConnectionBase.CanReuseStateObject(System.Net.Sockets.SocketAsyncEventArgs@)"> + <inheritdoc cref="T:NetSharp.Utils.SlimObjectPool`1.CanReuseObjectPredicate" /> + </member> + <member name="M:NetSharp.Raw.RawNetworkConnectionBase.CleanupTransmissionBufferAndState(System.Net.Sockets.SocketAsyncEventArgs)"> + <summary> + Performs cleanup on the given <paramref name="args" /> instance. + </summary> + <param name="args"> + The used <see cref="T:System.Net.Sockets.SocketAsyncEventArgs" /> that can be cleaned up to be reused. + </param> + </member> + <member name="M:NetSharp.Raw.RawNetworkConnectionBase.CreateStateObject"> + <inheritdoc cref="T:NetSharp.Utils.SlimObjectPool`1.CreateObjectDelegate" /> + </member> + <member name="M:NetSharp.Raw.RawNetworkConnectionBase.DestroyStateObject(System.Net.Sockets.SocketAsyncEventArgs)"> + <inheritdoc cref="T:NetSharp.Utils.SlimObjectPool`1.DestroyObjectDelegate" /> + </member> <member name="M:NetSharp.Raw.RawNetworkConnectionBase.Dispose(System.Boolean)"> <summary> Allows for inheritors to dispose of their own resources. </summary> </member> + <member name="M:NetSharp.Raw.RawNetworkConnectionBase.ResetStateObject(System.Net.Sockets.SocketAsyncEventArgs@)"> + <inheritdoc cref="T:NetSharp.Utils.SlimObjectPool`1.ResetObjectDelegate" /> + </member> <member name="M:NetSharp.Raw.RawNetworkConnectionBase.Dispose"> <inheritdoc /> </member> + <member name="T:NetSharp.Raw.RawNetworkReaderBase"> + <summary> + Provides fields and methods common to all network reader connections. + </summary> + </member> <member name="M:NetSharp.Raw.RawNetworkReaderBase.#ctor(System.Net.Sockets.Socket@,System.Net.EndPoint,System.Int32,System.Int32,System.UInt32)"> <inheritdoc /> </member> + <member name="P:NetSharp.Raw.RawNetworkReaderBase.ShutdownToken"> + <summary> + The <see cref="T:System.Threading.CancellationToken" /> for the network reader. + </summary> + </member> <member name="M:NetSharp.Raw.RawNetworkReaderBase.Dispose(System.Boolean)"> <inheritdoc /> </member> - <member name="M:NetSharp.Raw.RawNetworkReaderBase.Start(System.UInt16)"> + <member name="M:NetSharp.Raw.RawNetworkReaderBase.Shutdown"> <inheritdoc /> </member> - <member name="M:NetSharp.Raw.RawNetworkReaderBase.Shutdown"> + <member name="M:NetSharp.Raw.RawNetworkReaderBase.Start(System.UInt16)"> <inheritdoc /> </member> + <member name="T:NetSharp.Raw.RawNetworkWriterBase"> + <summary> + Provides fields and methods common to all network writer connections. + </summary> + </member> <member name="M:NetSharp.Raw.RawNetworkWriterBase.#ctor(System.Net.Sockets.Socket@,System.Net.EndPoint,System.Int32,System.Int32,System.UInt32)"> <inheritdoc /> </member> @@ -110,6 +404,31 @@ <member name="M:NetSharp.Raw.RawNetworkWriterBase.WriteAsync(System.Net.EndPoint,System.ReadOnlyMemory{System.Byte},System.Net.Sockets.SocketFlags)"> <inheritdoc /> </member> + <member name="T:NetSharp.Raw.Stream.RawStreamRequestHandler"> + <summary> + Represents a method that handles a request received by a <see cref="!:R" />. + </summary> + <param name="remoteEndPoint"> + The remote endpoint from which the request was received. + </param> + <param name="requestBuffer"> + The buffer containing the received request. + </param> + <param name="receivedRequestBytes"> + The number of bytes of user data received in the request. + </param> + <param name="responseBuffer"> + The buffer into which the response should be written. + </param> + <returns> + Whether there exists a response to be sent back to the remote endpoint. + </returns> + </member> + <member name="T:NetSharp.Raw.Stream.RawStreamNetworkReader"> + <summary> + Implements a raw network reader using a stream-based protocol. + </summary> + </member> <member name="M:NetSharp.Raw.Stream.RawStreamNetworkReader.#ctor(System.Net.Sockets.Socket@,NetSharp.Raw.Stream.RawStreamRequestHandler,System.Net.EndPoint,System.Int32,System.Int32,System.UInt32)"> <inheritdoc /> </member> @@ -128,6 +447,11 @@ <member name="M:NetSharp.Raw.Stream.RawStreamNetworkReader.Start(System.UInt16)"> <inheritdoc /> </member> + <member name="T:NetSharp.Raw.Stream.RawStreamNetworkWriter"> + <summary> + Implements a raw network writer using a stream-based protocol. + </summary> + </member> <member name="M:NetSharp.Raw.Stream.RawStreamNetworkWriter.#ctor(System.Net.Sockets.Socket@,System.Net.EndPoint,System.Int32,System.Int32,System.UInt32)"> <inheritdoc /> </member> @@ -143,6 +467,18 @@ <member name="M:NetSharp.Raw.Stream.RawStreamNetworkWriter.ResetStateObject(System.Net.Sockets.SocketAsyncEventArgs@)"> <inheritdoc /> </member> + <member name="M:NetSharp.Raw.Stream.RawStreamNetworkWriter.Read(System.Net.EndPoint@,System.Memory{System.Byte},System.Net.Sockets.SocketFlags)"> + <inheritdoc /> + </member> + <member name="M:NetSharp.Raw.Stream.RawStreamNetworkWriter.ReadAsync(System.Net.EndPoint,System.Memory{System.Byte},System.Net.Sockets.SocketFlags)"> + <inheritdoc /> + </member> + <member name="M:NetSharp.Raw.Stream.RawStreamNetworkWriter.Write(System.Net.EndPoint,System.ReadOnlyMemory{System.Byte},System.Net.Sockets.SocketFlags)"> + <inheritdoc /> + </member> + <member name="M:NetSharp.Raw.Stream.RawStreamNetworkWriter.WriteAsync(System.Net.EndPoint,System.ReadOnlyMemory{System.Byte},System.Net.Sockets.SocketFlags)"> + <inheritdoc /> + </member> <member name="T:NetSharp.Utils.Conversion.EndianAwareBitConverter"> <summary> Wraps the <see cref="T:System.BitConverter" /> class to provide conversion that is endian-aware. @@ -221,7 +557,7 @@ The type of item stored in the pool. </typeparam> </member> - <member name="M:NetSharp.Utils.SlimObjectPool`1.#ctor(NetSharp.Utils.SlimObjectPool{`0}.CreateObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.ResetObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.DestroyObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.CanRebufferObjectPredicate@,System.Collections.Concurrent.IProducerConsumerCollection{`0}@)"> + <member name="M:NetSharp.Utils.SlimObjectPool`1.#ctor(NetSharp.Utils.SlimObjectPool{`0}.CreateObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.ResetObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.DestroyObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.CanReuseObjectPredicate@,System.Collections.Concurrent.IProducerConsumerCollection{`0}@)"> <summary> Constructs a new instance of the <see cref="T:NetSharp.Utils.SlimObjectPool`1" /> class. </summary> @@ -241,7 +577,7 @@ The underlying pooled object buffer to use. </param> </member> - <member name="M:NetSharp.Utils.SlimObjectPool`1.#ctor(NetSharp.Utils.SlimObjectPool{`0}.CreateObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.ResetObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.DestroyObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.CanRebufferObjectPredicate@)"> + <member name="M:NetSharp.Utils.SlimObjectPool`1.#ctor(NetSharp.Utils.SlimObjectPool{`0}.CreateObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.ResetObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.DestroyObjectDelegate@,NetSharp.Utils.SlimObjectPool{`0}.CanReuseObjectPredicate@)"> <summary> Constructs a new instance of the <see cref="T:NetSharp.Utils.SlimObjectPool`1" /> class. </summary> @@ -258,7 +594,7 @@ The delegate method to use to decide whether an instance can be reused. </param> </member> - <member name="T:NetSharp.Utils.SlimObjectPool`1.CanRebufferObjectPredicate"> + <member name="T:NetSharp.Utils.SlimObjectPool`1.CanReuseObjectPredicate"> <summary> Delegate method to check whether the given <paramref name="instance" /> can and should be placed back into the pool. If <c>true</c> is returned, the <paramref name="instance" /> is reset and placed back into the pool. Otherwise, the instance is destroyed. diff --git a/NetSharp/NetSharp/Packets/RawStreamPacket.cs b/NetSharp/NetSharp/Packets/RawStreamPacket.cs @@ -5,34 +5,42 @@ using NetSharp.Utils.Conversion; namespace NetSharp.Packets { - internal readonly struct RawStreamPacket - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void Serialise(in Memory<byte> buffer, in RawStreamPacketHeader packetHeader, in ReadOnlyMemory<byte> packetData) - { - packetHeader.Serialise(buffer.Slice(0, RawStreamPacketHeader.TotalSize)); - - packetData.CopyTo(buffer.Slice(RawStreamPacketHeader.TotalSize, packetData.Length)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static int TotalPacketSize(in RawStreamPacketHeader packetHeader) - { - return RawStreamPacketHeader.TotalSize + packetHeader.DataSize; - } - } - + /// <summary> + /// Holds metadata about a raw stream packet. + /// </summary> internal readonly struct RawStreamPacketHeader { + /// <summary> + /// The total size of the header in bytes. + /// </summary> internal const int TotalSize = sizeof(int); + /// <summary> + /// The size of the user supplied data segment in bytes. + /// </summary> internal readonly int DataSize; + /// <summary> + /// Constructs a new instance of the <see cref="RawStreamPacketHeader" /> struct. + /// </summary> + /// <param name="dataSize"> + /// The size of the user supplied data segment. + /// </param> internal RawStreamPacketHeader(int dataSize) { DataSize = dataSize; } + /// <summary> + /// Deserialises a <see cref="RawStreamPacketHeader" /> instance from the given <paramref name="buffer" />. + /// </summary> + /// <param name="buffer"> + /// A buffer containing a serialised <see cref="RawStreamPacketHeader" /> instance. Must be at least of size <see cref="TotalSize" />. + /// </param> + /// <returns> + /// The deserialised instance. + /// </returns> + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static RawStreamPacketHeader Deserialise(in Memory<byte> buffer) { Span<byte> serialisedDataSize = buffer.Slice(0, sizeof(int)).Span; @@ -41,15 +49,59 @@ namespace NetSharp.Packets return new RawStreamPacketHeader(dataSize); } + /// <summary> + /// Serialises the current <see cref="RawStreamPacketHeader" /> instance into the given <paramref name="buffer" />. + /// </summary> + /// <param name="buffer"> + /// The buffer into which to serialise the current instance. Must be at least of size <see cref="TotalSize" />. + /// </param> + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal void Serialise(in Memory<byte> buffer) { Span<byte> serialisedDataSize = EndianAwareBitConverter.GetBytes(DataSize); serialisedDataSize.CopyTo(buffer.Slice(0, sizeof(int)).Span); } + } - public override string ToString() + /// <summary> + /// Provides helper methods to manipulate the binary packet format used by stream network handlers. + /// </summary> + internal static class RawStreamPacket + { + /// <summary> + /// Serialises the given <paramref name="packetHeader" /> and <paramref name="packetData" /> into the given <paramref name="buffer" />. + /// </summary> + /// <param name="buffer"> + /// The buffer into which the packet should be serialised. Must be at least of size <see cref="RawStreamPacketHeader.TotalSize" /> + the size + /// of the user data given by <paramref name="packetHeader" />. + /// </param> + /// <param name="packetHeader"> + /// The header containing metatdata abut the raw stream packet. + /// </param> + /// <param name="packetData"> + /// The user data held in the raw stream packet. + /// </param> + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static void Serialise(in Memory<byte> buffer, in RawStreamPacketHeader packetHeader, in ReadOnlyMemory<byte> packetData) { - return $"[Data Segment Size: {DataSize}]"; + packetHeader.Serialise(buffer.Slice(0, RawStreamPacketHeader.TotalSize)); + + packetData.CopyTo(buffer.Slice(RawStreamPacketHeader.TotalSize, packetData.Length)); + } + + /// <summary> + /// Calculates the total size of a raw stream packet, using the packet data size in the given <paramref name="packetHeader" />. + /// </summary> + /// <param name="packetHeader"> + /// The header for which to calculate the total packet size. + /// </param> + /// <returns> + /// The total size of a raw stream packet with the given <paramref name="packetHeader" />. + /// </returns> + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static int TotalPacketSize(in RawStreamPacketHeader packetHeader) + { + return RawStreamPacketHeader.TotalSize + packetHeader.DataSize; } } } \ No newline at end of file diff --git a/NetSharp/NetSharp/Properties/Resources.Designer.cs b/NetSharp/NetSharp/Properties/Resources.Designer.cs @@ -61,6 +61,15 @@ namespace NetSharp.Properties { } /// <summary> + /// Looks up a localized string similar to Cannot rent a temporary buffer of size: {0} bytes. The maximum temporary buffer size is {1} bytes. + /// </summary> + internal static string RawDatagramNetworkReaderRentedBufferSizeError { + get { + return ResourceManager.GetString("RawDatagramNetworkReaderRentedBufferSizeError", resourceCulture); + } + } + + /// <summary> /// Looks up a localized string similar to The datagram size must be between 0 and 65507 bytes. /// </summary> internal static string RawDatagramSizeError { diff --git a/NetSharp/NetSharp/Properties/Resources.pl-PL.resx b/NetSharp/NetSharp/Properties/Resources.pl-PL.resx @@ -117,6 +117,9 @@ <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> + <data name="RawDatagramNetworkReaderRentedBufferSizeError" xml:space="preserve"> + <value>Nie można wypożyczyć bufor o wielkości {0} bajtów. Maksymalna wielkość buforu to {1} bajtów.</value> + </data> <data name="RawDatagramSizeError" xml:space="preserve"> <value>Wielkość datagramu powinna być pomiędzy 0 a 65507 bajtów</value> </data> diff --git a/NetSharp/NetSharp/Properties/Resources.resx b/NetSharp/NetSharp/Properties/Resources.resx @@ -117,6 +117,9 @@ <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> + <data name="RawDatagramNetworkReaderRentedBufferSizeError" xml:space="preserve"> + <value>Cannot rent a temporary buffer of size: {0} bytes. The maximum temporary buffer size is {1} bytes</value> + </data> <data name="RawDatagramSizeError" xml:space="preserve"> <value>The datagram size must be between 0 and 65507 bytes</value> </data> diff --git a/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkReader.cs b/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkReader.cs @@ -5,9 +5,31 @@ using System.Runtime.CompilerServices; namespace NetSharp.Raw.Datagram { + /// <summary> + /// Represents a method that handles a request received by a <see cref="RawDatagramNetworkReader" />. + /// </summary> + /// <param name="remoteEndPoint"> + /// The remote endpoint from which the request was received. + /// </param> + /// <param name="requestBuffer"> + /// The buffer containing the received request. + /// </param> + /// <param name="receivedRequestBytes"> + /// The number of bytes of user data received in the request. + /// </param> + /// <param name="responseBuffer"> + /// The buffer into which the response should be written. + /// </param> + /// <returns> + /// Whether there exists a response to be sent back to the remote endpoint. + /// </returns> + // TODO implement this in a better, more robust and extensible way public delegate bool RawDatagramRequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, in Memory<byte> responseBuffer); + /// <summary> + /// Implements a raw network reader using a datagram-based protocol. + /// </summary> public sealed class RawDatagramNetworkReader : RawNetworkReaderBase { private readonly int datagramSize; diff --git a/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkWriter.cs b/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkWriter.cs @@ -3,8 +3,13 @@ using System.Net; using System.Net.Sockets; using System.Threading.Tasks; +using NetSharp.Properties; + namespace NetSharp.Raw.Datagram { + /// <summary> + /// Implements a raw network writer using a datagram-based protocol. + /// </summary> public sealed class RawDatagramNetworkWriter : RawNetworkWriterBase { private readonly int datagramSize; @@ -15,7 +20,7 @@ namespace NetSharp.Raw.Datagram { if (datagramSize <= 0 || MaxDatagramSize < datagramSize) { - throw new ArgumentOutOfRangeException(nameof(datagramSize), datagramSize, Properties.Resources.RawDatagramSizeError); + throw new ArgumentOutOfRangeException(nameof(datagramSize), datagramSize, Resources.RawDatagramSizeError); } this.datagramSize = datagramSize; @@ -120,7 +125,7 @@ namespace NetSharp.Raw.Datagram if (totalBytes > datagramSize) { throw new ArgumentException( - $"Cannot rent a temporary buffer of size: {totalBytes} bytes; maximum temporary buffer size: {datagramSize} bytes", + string.Format(Resources.Culture, Resources.RawDatagramNetworkReaderRentedBufferSizeError, totalBytes, datagramSize), nameof(readBuffer) ); } @@ -142,7 +147,7 @@ namespace NetSharp.Raw.Datagram if (totalBytes > datagramSize) { throw new ArgumentException( - $"Cannot rent a temporary buffer of size: {totalBytes} bytes; maximum temporary buffer size: {datagramSize} bytes", + string.Format(Resources.Culture, Resources.RawDatagramNetworkReaderRentedBufferSizeError, totalBytes, datagramSize), nameof(readBuffer) ); } @@ -183,7 +188,7 @@ namespace NetSharp.Raw.Datagram if (totalBytes > datagramSize) { throw new ArgumentException( - $"Cannot rent a temporary buffer of size: {totalBytes} bytes; maximum temporary buffer size: {datagramSize} bytes", + string.Format(Resources.Culture, Resources.RawDatagramNetworkReaderRentedBufferSizeError, totalBytes, datagramSize), nameof(writeBuffer) ); } @@ -205,7 +210,7 @@ namespace NetSharp.Raw.Datagram if (totalBytes > datagramSize) { throw new ArgumentException( - $"Cannot rent a temporary buffer of size: {totalBytes} bytes; maximum temporary buffer size: {datagramSize} bytes", + string.Format(Resources.Culture, Resources.RawDatagramNetworkReaderRentedBufferSizeError, totalBytes, datagramSize), nameof(writeBuffer) ); } diff --git a/NetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs b/NetSharp/NetSharp/Raw/RawNetworkConnectionBase.cs @@ -8,6 +8,9 @@ using NetSharp.Utils; namespace NetSharp.Raw { + /// <summary> + /// Defines fields and methods common to all network connections. + /// </summary> public abstract class RawNetworkConnectionBase : IDisposable { private readonly SlimObjectPool<SocketAsyncEventArgs> argsPool; @@ -18,11 +21,41 @@ namespace NetSharp.Raw 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; + /// <summary> + /// The maximum size of a pooled buffer that can be used with the <see cref="ArrayPool{T}.Shared" /> property, before a new custom pool must + /// be created. Taken from: https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/Buffers/ConfigurableArrayPool.cs + /// </summary> + protected const int DefaultMaxPooledBufferSize = 1024 * 1024; + + /// <summary> + /// The maximum number of pooled buffers per bucket that can be used with the <see cref="ArrayPool{T}.Shared" /> property, before a new custom + /// pool must be created. Taken from: https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/shared/System/Buffers/ConfigurableArrayPool.cs + /// </summary> + protected const int DefaultMaxPooledBuffersPerBucket = 50; + /// <summary> + /// The maximum size that a user supplied data buffer can be to fit into a UDP datagram. + /// </summary> protected const int MaxDatagramSize = ushort.MaxValue - 28; // 65535 - 28 = 65507 + /// <summary> + /// Constructs a new instance of the <see cref="RawNetworkConnectionBase" /> class. + /// </summary> + /// <param name="rawConnection"> + /// The underlying <see cref="Socket" /> to use for the connection. + /// </param> + /// <param name="defaultEndPoint"> + /// The default endpoint to use to represent remote clients. + /// </param> + /// <param name="maxPooledBufferSize"> + /// The maximum size of a pooled buffer. + /// </param> + /// <param name="pooledBuffersPerBucket"> + /// The number of pooled buffers to hold in a single pool bucket. + /// </param> + /// <param name="preallocatedStateObjects"> + /// The number of state objects to preallocate. + /// </param> protected RawNetworkConnectionBase(ref Socket rawConnection, EndPoint defaultEndPoint, int maxPooledBufferSize, int pooledBuffersPerBucket = 50, uint preallocatedStateObjects = 0) { @@ -43,16 +76,35 @@ namespace NetSharp.Raw } } + /// <summary> + /// The object pool to use to pool <see cref="SocketAsyncEventArgs" /> instances. + /// </summary> protected ref readonly SlimObjectPool<SocketAsyncEventArgs> ArgsPool => ref argsPool; + /// <summary> + /// The object pool to use to pool byte buffer instance + /// </summary> protected ref readonly ArrayPool<byte> BufferPool => ref bufferPool; + /// <summary> + /// The underlying connection socket. + /// </summary> protected ref readonly Socket Connection => ref connection; + /// <summary> + /// The default endpoint to use to represent remote clients. + /// </summary> protected ref readonly EndPoint DefaultEndPoint => ref defaultEndPoint; + /// <inheritdoc cref="SlimObjectPool{T}.CanReuseObjectPredicate" /> protected abstract bool CanReuseStateObject(ref SocketAsyncEventArgs instance); + /// <summary> + /// Performs cleanup on the given <paramref name="args" /> instance. + /// </summary> + /// <param name="args"> + /// The used <see cref="SocketAsyncEventArgs" /> that can be cleaned up to be reused. + /// </param> [MethodImpl(MethodImplOptions.AggressiveInlining)] protected void CleanupTransmissionBufferAndState(SocketAsyncEventArgs args) { @@ -63,8 +115,10 @@ namespace NetSharp.Raw } } + /// <inheritdoc cref="SlimObjectPool{T}.CreateObjectDelegate" /> protected abstract SocketAsyncEventArgs CreateStateObject(); + /// <inheritdoc cref="SlimObjectPool{T}.DestroyObjectDelegate" /> protected abstract void DestroyStateObject(SocketAsyncEventArgs instance); /// <summary> @@ -80,6 +134,7 @@ namespace NetSharp.Raw argsPool.Dispose(); } + /// <inheritdoc cref="SlimObjectPool{T}.ResetObjectDelegate" /> protected abstract void ResetStateObject(ref SocketAsyncEventArgs instance); /// <inheritdoc /> diff --git a/NetSharp/NetSharp/Raw/RawNetworkReaderBase.cs b/NetSharp/NetSharp/Raw/RawNetworkReaderBase.cs @@ -6,7 +6,10 @@ using NetSharp.Interfaces; namespace NetSharp.Raw { - public abstract class RawNetworkReaderBase : RawNetworkConnectionBase, INetworkReader + /// <summary> + /// Provides fields and methods common to all network reader connections. + /// </summary> + public abstract class RawNetworkReaderBase : RawNetworkConnectionBase, IRawNetworkReader { private readonly CancellationToken shutdownToken; private readonly CancellationTokenSource shutdownTokenSource; @@ -19,6 +22,9 @@ namespace NetSharp.Raw shutdownToken = shutdownTokenSource.Token; } + /// <summary> + /// The <see cref="CancellationToken" /> for the network reader. + /// </summary> protected ref readonly CancellationToken ShutdownToken => ref shutdownToken; /// <inheritdoc /> @@ -36,12 +42,12 @@ namespace NetSharp.Raw } /// <inheritdoc /> - public abstract void Start(ushort concurrentReadTasks); - - /// <inheritdoc /> public void Shutdown() { shutdownTokenSource.Cancel(); } + + /// <inheritdoc /> + public abstract void Start(ushort concurrentReadTasks); } } \ No newline at end of file diff --git a/NetSharp/NetSharp/Raw/RawNetworkWriterBase.cs b/NetSharp/NetSharp/Raw/RawNetworkWriterBase.cs @@ -7,7 +7,10 @@ using NetSharp.Interfaces; namespace NetSharp.Raw { - public abstract class RawNetworkWriterBase : RawNetworkConnectionBase, INetworkWriter + /// <summary> + /// Provides fields and methods common to all network writer connections. + /// </summary> + public abstract class RawNetworkWriterBase : RawNetworkConnectionBase, IRawNetworkWriter { /// <inheritdoc /> protected RawNetworkWriterBase(ref Socket rawConnection, EndPoint defaultEndPoint, int maxPooledBufferSize = DefaultMaxPooledBufferSize, int pooledBuffersPerBucket = 50, diff --git a/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs b/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs @@ -6,9 +6,31 @@ using NetSharp.Packets; namespace NetSharp.Raw.Stream { + /// <summary> + /// Represents a method that handles a request received by a <see cref="RawStreamNetworkReader" />. + /// </summary> + /// <param name="remoteEndPoint"> + /// The remote endpoint from which the request was received. + /// </param> + /// <param name="requestBuffer"> + /// The buffer containing the received request. + /// </param> + /// <param name="receivedRequestBytes"> + /// The number of bytes of user data received in the request. + /// </param> + /// <param name="responseBuffer"> + /// The buffer into which the response should be written. + /// </param> + /// <returns> + /// Whether there exists a response to be sent back to the remote endpoint. + /// </returns> + // TODO implement this in a better, more robust and extensible way public delegate bool RawStreamRequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, in Memory<byte> responseBuffer); + /// <summary> + /// Implements a raw network reader using a stream-based protocol. + /// </summary> public sealed class RawStreamNetworkReader : RawNetworkReaderBase { private readonly RawStreamRequestHandler RequestHandler; diff --git a/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkWriter.cs b/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkWriter.cs @@ -7,6 +7,9 @@ using NetSharp.Packets; namespace NetSharp.Raw.Stream { + /// <summary> + /// Implements a raw network writer using a stream-based protocol. + /// </summary> public sealed class RawStreamNetworkWriter : RawNetworkWriterBase { /// <inheritdoc /> @@ -273,6 +276,7 @@ namespace NetSharp.Raw.Stream { } + /// <inheritdoc /> 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) @@ -304,6 +308,7 @@ namespace NetSharp.Raw.Stream return bodyBytes; // we only return the number of bytes of user data that were read } + /// <inheritdoc /> public override ValueTask<int> ReadAsync(EndPoint remoteEndPoint, Memory<byte> readBuffer, SocketFlags flags = SocketFlags.None) { TaskCompletionSource<int> tcs = new TaskCompletionSource<int>(); @@ -319,6 +324,7 @@ namespace NetSharp.Raw.Stream return new ValueTask<int>(tcs.Task); } + /// <inheritdoc /> public override int Write(EndPoint remoteEndPoint, ReadOnlyMemory<byte> writeBuffer, SocketFlags flags = SocketFlags.None) { static int WriteBytesFromBuffer(Socket connection, ref byte[] buffer, int count, SocketFlags flags) @@ -345,6 +351,7 @@ namespace NetSharp.Raw.Stream return pendingPacketHeader.DataSize; // we only return the number of bytes of user data that were written } + /// <inheritdoc /> public override ValueTask<int> WriteAsync(EndPoint remoteEndPoint, ReadOnlyMemory<byte> writeBuffer, SocketFlags flags = SocketFlags.None) { TaskCompletionSource<int> tcs = new TaskCompletionSource<int>(); diff --git a/NetSharp/NetSharp/Utils/SlimObjectPool.cs b/NetSharp/NetSharp/Utils/SlimObjectPool.cs @@ -11,7 +11,7 @@ namespace NetSharp.Utils /// </typeparam> public sealed class SlimObjectPool<T> : IDisposable { - private readonly CanRebufferObjectPredicate canObjectBeRebufferedPredicate; + private readonly CanReuseObjectPredicate canObjectBeRebufferedPredicate; private readonly CreateObjectDelegate createObjectDelegate; private readonly DestroyObjectDelegate destroyObjectDelegate; private readonly IProducerConsumerCollection<T> objectBuffer; @@ -36,7 +36,7 @@ namespace NetSharp.Utils /// The underlying pooled object buffer to use. /// </param> public SlimObjectPool(in CreateObjectDelegate createDelegate, in ResetObjectDelegate resetDelegate, - in DestroyObjectDelegate destroyDelegate, in CanRebufferObjectPredicate rebufferPredicate, + in DestroyObjectDelegate destroyDelegate, in CanReuseObjectPredicate rebufferPredicate, in IProducerConsumerCollection<T> baseCollection) { createObjectDelegate = createDelegate; @@ -66,7 +66,7 @@ namespace NetSharp.Utils /// The delegate method to use to decide whether an instance can be reused. /// </param> public SlimObjectPool(in CreateObjectDelegate createDelegate, in ResetObjectDelegate resetDelegate, - in DestroyObjectDelegate destroyDelegate, in CanRebufferObjectPredicate rebufferPredicate) + in DestroyObjectDelegate destroyDelegate, in CanReuseObjectPredicate rebufferPredicate) : this(in createDelegate, in resetDelegate, in destroyDelegate, in rebufferPredicate, new ConcurrentBag<T>()) { } @@ -81,7 +81,7 @@ namespace NetSharp.Utils /// <returns> /// Whether the given instance should be placed back into the pool. /// </returns> - public delegate bool CanRebufferObjectPredicate(ref T instance); + public delegate bool CanReuseObjectPredicate(ref T instance); /// <summary> /// Delegate method for creating fresh <typeparamref name="T" /> instances to be stored in the pool.