NetSharp

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

commit f5ccc28b2f4a061fd7fe0d37b35f700ff42321a5
parent 5d92816a0aa1097d0a28e8b9cfdf83bb2fd0032d
Author: Mikolaj Lenczewski <mikolaj.lenczewski308@gmail.com>
Date:   Sat,  9 May 2020 19:53:57 +0100

RawStreamNetworkReader now accepts variable-length packets.

Diffstat:
MNetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkReader.cs | 85+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
MNetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs | 237++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
MNetSharp/NetSharpExamples/BenchmarkHelper.cs | 2+-
MNetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs | 3++-
MNetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkReaderBenchmark.cs | 22+++++++++++++---------
MNetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs | 3++-
MNetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs | 3++-
7 files changed, 250 insertions(+), 105 deletions(-)

diff --git a/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkReader.cs b/NetSharp/NetSharp/Raw/Datagram/RawDatagramNetworkReader.cs @@ -1,36 +1,43 @@ using System; using System.Net; using System.Net.Sockets; +using System.Runtime.CompilerServices; namespace NetSharp.Raw.Datagram { - public delegate bool RawDatagramRequestHandler(in EndPoint remoteEndPoint, ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, - Memory<byte> responseBuffer); + public delegate bool RawDatagramRequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer); public sealed class RawDatagramNetworkReader : RawNetworkReaderBase { private const int MaxDatagramSize = ushort.MaxValue - 28; - private readonly int datagramSize; + private readonly int messageSize; private readonly RawDatagramRequestHandler requestHandler; /// <inheritdoc /> - public RawDatagramNetworkReader(ref Socket rawConnection, RawDatagramRequestHandler? requestHandler, EndPoint defaultEndPoint, int datagramSize, - int pooledBuffersPerBucket = 50, uint preallocatedStateObjects = 0) : base(ref rawConnection, defaultEndPoint, datagramSize, + public RawDatagramNetworkReader(ref Socket rawConnection, RawDatagramRequestHandler? requestHandler, EndPoint defaultEndPoint, int messageSize, + int pooledBuffersPerBucket = 50, uint preallocatedStateObjects = 0) : base(ref rawConnection, defaultEndPoint, messageSize, pooledBuffersPerBucket, preallocatedStateObjects) { - if (datagramSize <= 0 || MaxDatagramSize < datagramSize) + if (messageSize <= 0 || MaxDatagramSize < messageSize) { - throw new ArgumentOutOfRangeException(nameof(datagramSize), datagramSize, + throw new ArgumentOutOfRangeException(nameof(messageSize), messageSize, $"The datagram size must be greater than 0 and less than {MaxDatagramSize}"); } - this.datagramSize = datagramSize; + this.messageSize = messageSize; this.requestHandler = requestHandler ?? DefaultRequestHandler; } + private static bool DefaultRequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer) + { + return requestBuffer.TryCopyTo(responseBuffer); + } + private void CompleteReceiveFrom(SocketAsyncEventArgs args) { byte[] receiveBuffer = args.Buffer; @@ -38,15 +45,20 @@ namespace NetSharp.Raw.Datagram switch (args.SocketError) { case SocketError.Success: - byte[] responseBuffer = BufferPool.Rent(datagramSize); + byte[] responseBuffer = BufferPool.Rent(messageSize); + + bool responseExists = requestHandler(args.RemoteEndPoint, receiveBuffer, args.BytesTransferred, responseBuffer); + BufferPool.Return(receiveBuffer, true); - bool responseExists = - requestHandler(args.RemoteEndPoint, receiveBuffer, args.BytesTransferred, responseBuffer); + if (responseExists) + { + args.SetBuffer(responseBuffer, 0, messageSize); - Buffer.BlockCopy(responseBuffer, 0, receiveBuffer, 0, datagramSize); - BufferPool.Return(responseBuffer, true); + SendTo(args); + return; + } - if (responseExists) StartSendTo(args); + BufferPool.Return(responseBuffer, true); break; default: @@ -64,6 +76,13 @@ namespace NetSharp.Raw.Datagram ArgsPool.Return(args); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void ConfigureReceiveFrom(SocketAsyncEventArgs args) + { + byte[] receiveBuffer = BufferPool.Rent(messageSize); + args.SetBuffer(receiveBuffer, 0, messageSize); + } + private void HandleIoCompleted(object sender, SocketAsyncEventArgs args) { switch (args.LastOperation) @@ -80,18 +99,7 @@ namespace NetSharp.Raw.Datagram } } - private void StartDefaultReceiveFrom() - { - if (ShutdownToken.IsCancellationRequested) - { - return; - } - - SocketAsyncEventArgs args = ArgsPool.Rent(); - StartReceiveFrom(args); - } - - private void StartReceiveFrom(SocketAsyncEventArgs args) + private void ReceiveFrom(SocketAsyncEventArgs args) { if (ShutdownToken.IsCancellationRequested) { @@ -99,16 +107,13 @@ namespace NetSharp.Raw.Datagram return; } - byte[] receiveBuffer = BufferPool.Rent(datagramSize); - args.SetBuffer(receiveBuffer, 0, datagramSize); - if (Connection.ReceiveFromAsync(args)) return; StartDefaultReceiveFrom(); CompleteReceiveFrom(args); } - private void StartSendTo(SocketAsyncEventArgs args) + private void SendTo(SocketAsyncEventArgs args) { if (ShutdownToken.IsCancellationRequested) { @@ -125,6 +130,20 @@ namespace NetSharp.Raw.Datagram CompleteSendTo(args); } + private void StartDefaultReceiveFrom() + { + if (ShutdownToken.IsCancellationRequested) + { + return; + } + + SocketAsyncEventArgs args = ArgsPool.Rent(); + + ConfigureReceiveFrom(args); + + ReceiveFrom(args); + } + /// <inheritdoc /> protected override bool CanReuseStateObject(ref SocketAsyncEventArgs instance) { @@ -153,12 +172,6 @@ namespace NetSharp.Raw.Datagram instance.RemoteEndPoint = DefaultEndPoint; } - public static bool DefaultRequestHandler(in EndPoint remoteEndPoint, ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, - Memory<byte> responseBuffer) - { - return requestBuffer.TryCopyTo(responseBuffer); - } - /// <inheritdoc /> public override void Start(ushort concurrentReadTasks) { diff --git a/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs b/NetSharp/NetSharp/Raw/Stream/RawStreamNetworkReader.cs @@ -2,31 +2,98 @@ using System.Net; using System.Net.Sockets; using System.Runtime.CompilerServices; +using NetSharp.Utils.Conversion; namespace NetSharp.Raw.Stream { - public delegate bool RawStreamRequestHandler(in EndPoint remoteEndPoint, ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, - Memory<byte> responseBuffer); + public delegate bool RawStreamRequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer); - public sealed class RawStreamNetworkReader : RawNetworkReaderBase + public readonly struct RawMessage { - // TODO remove and replace with proper packet size - private readonly int datagramSize; + public readonly Memory<byte> MsgData; + public readonly Header MsgHeader; + + private RawMessage(in Header header, in Memory<byte> data) + { + MsgHeader = header; + + MsgData = data; + } + + public RawMessage(in Memory<byte> data) + { + MsgHeader = new Header(data.Length); + + MsgData = data; + } + + public static RawMessage Deserialise(in Memory<byte> buffer) + { + Memory<byte> serialisedHeader = buffer.Slice(0, Header.TotalHeaderSize); + Header header = Header.Deserialise(in serialisedHeader); + + Memory<byte> serialisedData = buffer.Slice(Header.TotalHeaderSize); + return new RawMessage(in header, in serialisedData); + } + + public void Serialise(in Memory<byte> buffer) + { + MsgHeader.Serialise(buffer.Slice(0, Header.TotalHeaderSize)); + + MsgData.CopyTo(buffer.Slice(Header.TotalHeaderSize, MsgData.Length)); + } + + public readonly struct Header + { + public const int TotalHeaderSize = sizeof(int); + + public readonly int DataSize; + + internal Header(int dataSize) + { + DataSize = dataSize; + } + + public static Header Deserialise(in Memory<byte> buffer) + { + Span<byte> serialisedDataSize = buffer.Slice(0, sizeof(int)).Span; + int dataSize = EndianAwareBitConverter.ToInt32(serialisedDataSize); + + return new Header(dataSize); + } + + public void Serialise(in Memory<byte> buffer) + { + Span<byte> serialisedDataSize = EndianAwareBitConverter.GetBytes(DataSize); + serialisedDataSize.CopyTo(buffer.Slice(0, sizeof(int)).Span); + } + } + } + + public sealed class RawStreamNetworkReader : RawNetworkReaderBase + { private readonly RawStreamRequestHandler requestHandler; /// <inheritdoc /> - public RawStreamNetworkReader(ref Socket rawConnection, RawStreamRequestHandler? requestHandler, EndPoint defaultEndPoint, int pooledPacketBufferSize, - int pooledBuffersPerBucket = 50, uint preallocatedStateObjects = 0) : base(ref rawConnection, defaultEndPoint, pooledPacketBufferSize, + public RawStreamNetworkReader(ref Socket rawConnection, RawStreamRequestHandler? requestHandler, EndPoint defaultEndPoint, int maxMessageSize, + int pooledBuffersPerBucket = 50, uint preallocatedStateObjects = 0) : base(ref rawConnection, defaultEndPoint, maxMessageSize, pooledBuffersPerBucket, preallocatedStateObjects) { - datagramSize = pooledPacketBufferSize; - this.requestHandler = requestHandler ?? DefaultRequestHandler; } + private static bool DefaultRequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer) + { + return requestBuffer.TryCopyTo(responseBuffer); + } + private void CloseClientConnection(SocketAsyncEventArgs args) { + args.BufferList = null; + byte[] rentedBuffer = args.Buffer; BufferPool.Return(rentedBuffer, true); @@ -44,16 +111,13 @@ namespace NetSharp.Raw.Stream switch (args.SocketError) { case SocketError.Success: - StartReceive(args); - break; + //ConfigureReceiveHeader(args); // inlined for performance + byte[] receiveBuffer = BufferPool.Rent(RawMessage.Header.TotalHeaderSize); + args.SetBuffer(receiveBuffer, 0, RawMessage.Header.TotalHeaderSize); - case SocketError.ConnectionReset: - /* - * The SocketAsyncEventArgs.Completed event can occur in some cases when no connection has been accepted and cause the SocketAsyncEventArgs.SocketError property to be set to ConnectionReset. - * This can occur as a result of port scanning using a half-open SYN type scan (a SYN -> SYN-ACK -> RST sequence). - * Applications using the AcceptAsync method should be prepared to handle this condition. - */ - ArgsPool.Return(args); + args.UserToken = new TransmissionToken(RawMessage.Header.TotalHeaderSize, 0); + + StartReceive(args); break; default: @@ -69,40 +133,78 @@ namespace NetSharp.Raw.Stream TransmissionToken token = (TransmissionToken)args.UserToken; byte[] receiveBuffer = args.Buffer; - int expectedBytes = receiveBuffer.Length; + Memory<byte> receiveBufferMemory = new Memory<byte>(receiveBuffer); + + int expectedBytes = token.ExpectedBytes; + + bool readHeader = expectedBytes == RawMessage.Header.TotalHeaderSize; switch (args.SocketError) { case SocketError.Success: - int receivedBytes = args.BytesTransferred, totalReceivedBytes = token.BytesTransferred; + int receivedBytes = args.BytesTransferred, previousReceivedBytes = token.BytesTransferred, totalReceivedBytes = previousReceivedBytes + receivedBytes; - if (totalReceivedBytes + receivedBytes == expectedBytes) // transmission complete + if (totalReceivedBytes == expectedBytes) // transmission complete { - byte[] responseBuffer = BufferPool.Rent(expectedBytes); + if (readHeader) // handle a received message header + { + Memory<byte> headerBuffer = receiveBufferMemory.Slice(0, RawMessage.Header.TotalHeaderSize); + RawMessage.Header header = RawMessage.Header.Deserialise(in headerBuffer); - bool responseExists = - requestHandler(args.AcceptSocket.RemoteEndPoint, receiveBuffer, totalReceivedBytes + receivedBytes, responseBuffer); + //ConfigureReceiveData(args, in header); // inlined for performance + byte[] newReceiveBuffer = BufferPool.Rent(header.DataSize); + args.SetBuffer(newReceiveBuffer, 0, header.DataSize); - Buffer.BlockCopy(responseBuffer, 0, receiveBuffer, 0, datagramSize); - BufferPool.Return(responseBuffer, true); + token = new TransmissionToken(header.DataSize, 0); + args.UserToken = token; - if (responseExists) + StartReceive(args); + } + else // handle a received message header { - TransmissionToken sendToken = new TransmissionToken(0); - args.UserToken = sendToken; + EndPoint clientEndPoint = args.AcceptSocket.RemoteEndPoint; - StartSend(args); - return; - } + int responseBufferSize = RawMessage.Header.TotalHeaderSize + expectedBytes; + byte[] responseBuffer = BufferPool.Rent(responseBufferSize); + Memory<byte> responseBufferMemory = new Memory<byte>(responseBuffer); - StartReceive(args); + Memory<byte> headerMemory = responseBufferMemory.Slice(0, RawMessage.Header.TotalHeaderSize); + Memory<byte> responseMemory = responseBufferMemory.Slice(RawMessage.Header.TotalHeaderSize, expectedBytes); + + bool responseExists = requestHandler(clientEndPoint, receiveBuffer[..expectedBytes], totalReceivedBytes, responseMemory); + BufferPool.Return(receiveBuffer, true); + + if (responseExists) + { + RawMessage.Header responseHeader = new RawMessage.Header(responseMemory.Length); + responseHeader.Serialise(in headerMemory); + + args.SetBuffer(responseBuffer, 0, responseBufferSize); + + TransmissionToken sendToken = new TransmissionToken(responseBufferSize, 0); + args.UserToken = sendToken; + + StartSend(args); + return; + } + + BufferPool.Return(responseBuffer, true); + + //ConfigureReceiveHeader(args); // inlined for performance + byte[] newReceiveBuffer = BufferPool.Rent(RawMessage.Header.TotalHeaderSize); + args.SetBuffer(newReceiveBuffer, 0, RawMessage.Header.TotalHeaderSize); + + args.UserToken = new TransmissionToken(RawMessage.Header.TotalHeaderSize, 0); + + StartReceive(args); + } } - else if (0 < totalReceivedBytes + receivedBytes && totalReceivedBytes + receivedBytes < expectedBytes) // transmission not complete + else if (0 < totalReceivedBytes && totalReceivedBytes < expectedBytes) // transmission not complete { - token = new TransmissionToken(in token, args.BytesTransferred); + token = new TransmissionToken(in token, receivedBytes); args.UserToken = token; - args.SetBuffer(totalReceivedBytes, expectedBytes - receivedBytes); + args.SetBuffer(totalReceivedBytes, expectedBytes - totalReceivedBytes); ContinueReceive(args); } @@ -123,25 +225,31 @@ namespace NetSharp.Raw.Stream TransmissionToken token = (TransmissionToken)args.UserToken; byte[] sendBuffer = args.Buffer; - int expectedBytes = sendBuffer.Length; + int expectedBytes = token.ExpectedBytes; switch (args.SocketError) { case SocketError.Success: - int sentBytes = args.BytesTransferred, totalSentBytes = token.BytesTransferred; + int sentBytes = args.BytesTransferred, previousSentBytes = token.BytesTransferred, totalSentBytes = previousSentBytes + sentBytes; - if (totalSentBytes + sentBytes == expectedBytes) // transmission complete + if (totalSentBytes == expectedBytes) // transmission complete { BufferPool.Return(sendBuffer, true); + //ConfigureReceiveHeader(args); // inlined for performance + byte[] newReceiveBuffer = BufferPool.Rent(RawMessage.Header.TotalHeaderSize); + args.SetBuffer(newReceiveBuffer, 0, RawMessage.Header.TotalHeaderSize); + + args.UserToken = new TransmissionToken(RawMessage.Header.TotalHeaderSize, 0); + StartReceive(args); } - else if (0 < totalSentBytes + sentBytes && totalSentBytes + sentBytes < expectedBytes) // transmission not complete + else if (0 < totalSentBytes && totalSentBytes < expectedBytes) // transmission not complete { - token = new TransmissionToken(in token, args.BytesTransferred); + token = new TransmissionToken(in token, sentBytes); args.UserToken = token; - args.SetBuffer(totalSentBytes, expectedBytes - sentBytes); + args.SetBuffer(totalSentBytes, expectedBytes - totalSentBytes); ContinueSend(args); } @@ -158,6 +266,31 @@ namespace NetSharp.Raw.Stream } [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void ConfigureReceiveData(SocketAsyncEventArgs args, in RawMessage.Header header) + { + byte[] receiveBuffer = BufferPool.Rent(header.DataSize); + args.SetBuffer(receiveBuffer, 0, header.DataSize); + + TransmissionToken token = new TransmissionToken(header.DataSize, 0); + args.UserToken = token; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void ConfigureReceiveHeader(SocketAsyncEventArgs args) + { + byte[] receiveBuffer = BufferPool.Rent(RawMessage.Header.TotalHeaderSize); + args.SetBuffer(receiveBuffer, 0, RawMessage.Header.TotalHeaderSize); + + TransmissionToken token = new TransmissionToken(RawMessage.Header.TotalHeaderSize, 0); + args.UserToken = token; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void ConfigureSend(SocketAsyncEventArgs args) + { + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] private void ContinueReceive(SocketAsyncEventArgs args) { if (ShutdownToken.IsCancellationRequested) @@ -242,13 +375,6 @@ namespace NetSharp.Raw.Stream Socket clientSocket = args.AcceptSocket; - byte[] receiveBuffer = BufferPool.Rent(datagramSize); - - args.SetBuffer(receiveBuffer, 0, datagramSize); - - TransmissionToken token = new TransmissionToken(0); - args.UserToken = token; - if (clientSocket.ReceiveAsync(args)) return; CompleteReceive(args); @@ -297,12 +423,6 @@ namespace NetSharp.Raw.Stream instance.AcceptSocket = null; } - public static bool DefaultRequestHandler(in EndPoint remoteEndPoint, ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, - Memory<byte> responseBuffer) - { - return requestBuffer.TryCopyTo(responseBuffer); - } - /// <inheritdoc /> public override void Start(ushort concurrentReadTasks) { @@ -315,14 +435,19 @@ namespace NetSharp.Raw.Stream private readonly struct TransmissionToken { public readonly int BytesTransferred; + public readonly int ExpectedBytes; - public TransmissionToken(int bytesTransferred) + public TransmissionToken(int expectedBytes, int bytesTransferred) { + ExpectedBytes = expectedBytes; + BytesTransferred = bytesTransferred; } public TransmissionToken(in TransmissionToken token, int newlyTransferredBytes) { + ExpectedBytes = token.ExpectedBytes; + BytesTransferred = token.BytesTransferred + newlyTransferredBytes; } } diff --git a/NetSharp/NetSharpExamples/BenchmarkHelper.cs b/NetSharp/NetSharpExamples/BenchmarkHelper.cs @@ -37,7 +37,7 @@ namespace NetSharpExamples lock (typeof(Console)) { - Console.WriteLine($"[Client {clientId}] Sent {sentPacketCount} packets (of size {packetSize}) in {millis} milliseconds"); + Console.WriteLine($"[Client {clientId}] Sent {sentPacketCount} packets (of size {packetSize} bytes; {megabytes / 1000} gigabytes [one-way]) in {millis} milliseconds"); Console.WriteLine($"[Client {clientId}] Approximate bandwidth: {bandwidth:F3} MBps"); } } diff --git a/NetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs b/NetSharp/NetSharpExamples/Benchmarks/Datagram Network Connection Benchmarks/DatagramNetworkReaderBenchmark.cs @@ -25,7 +25,8 @@ namespace NetSharpExamples.Benchmarks.Datagram_Network_Connection_Benchmarks /// <inheritdoc /> public string Name { get; } = "Datagram Raw Network Reader Benchmark"; - private static bool RequestHandler(in EndPoint remoteEndPoint, ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, Memory<byte> responseBuffer) + private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer) { requestBuffer.CopyTo(responseBuffer); diff --git a/NetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkReaderBenchmark.cs b/NetSharp/NetSharpExamples/Benchmarks/Stream Network Connection Benchmarks/StreamNetworkReaderBenchmark.cs @@ -25,7 +25,8 @@ namespace NetSharpExamples.Benchmarks.Stream_Network_Connection_Benchmarks /// <inheritdoc /> public string Name { get; } = "Stream Raw Network Reader Benchmark"; - private static bool RequestHandler(in EndPoint remoteEndPoint, ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, Memory<byte> responseBuffer) + private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer) { requestBuffer.CopyTo(responseBuffer); @@ -44,8 +45,9 @@ namespace NetSharpExamples.Benchmarks.Stream_Network_Connection_Benchmarks ServerReadyEvent.Wait(); clientSocket.Connect(ServerEndPoint); - byte[] sendBuffer = new byte[PacketSize]; - byte[] receiveBuffer = new byte[PacketSize]; + byte[] sendBuffer = new byte[PacketSize + RawMessage.Header.TotalHeaderSize]; + byte[] receiveBuffer = new byte[PacketSize + RawMessage.Header.TotalHeaderSize]; + byte[] packetBuffer = new byte[PacketSize]; EndPoint remoteEndPoint = ServerEndPoint; @@ -56,8 +58,10 @@ namespace NetSharpExamples.Benchmarks.Stream_Network_Connection_Benchmarks for (int i = 0; i < PacketCount; i++) { - byte[] packetBuffer = ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})"); - packetBuffer.CopyTo(sendBuffer, 0); + ServerEncoding.GetBytes($"[Client {id}] Hello World! (Packet {i})").CopyTo(packetBuffer, 0); + + RawMessage message = new RawMessage(packetBuffer); + message.Serialise(sendBuffer); benchmarkHelper.StartStopwatch(); @@ -66,7 +70,7 @@ namespace NetSharpExamples.Benchmarks.Stream_Network_Connection_Benchmarks { totalSent += clientSocket.Send(sendBuffer, totalSent, sendBuffer.Length - totalSent, SocketFlags.None); - } while (totalSent != 0 && totalSent != sendBuffer.Length); + } while (totalSent != 0 && totalSent < sendBuffer.Length); if (totalSent == 0) { @@ -76,9 +80,9 @@ namespace NetSharpExamples.Benchmarks.Stream_Network_Connection_Benchmarks int totalReceived = 0; do { - totalReceived += clientSocket.Receive(receiveBuffer, totalReceived, - receiveBuffer.Length - totalReceived, SocketFlags.None); - } while (totalReceived != 0 && totalReceived != sendBuffer.Length); + totalReceived += clientSocket.Receive(receiveBuffer, totalReceived, receiveBuffer.Length - totalReceived, + SocketFlags.None); + } while (totalReceived != 0 && totalReceived < receiveBuffer.Length); if (totalReceived == 0) { diff --git a/NetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs b/NetSharp/NetSharpExamples/Examples/Datagram Network Connection Examples/DatagramNetworkReaderExample.cs @@ -17,7 +17,8 @@ namespace NetSharpExamples.Examples.Datagram_Network_Connection_Examples /// <inheritdoc /> public string Name { get; } = "Datagram Network Reader Example"; - private static bool RequestHandler(in EndPoint remoteEndPoint, ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, Memory<byte> responseBuffer) + private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer) { requestBuffer.CopyTo(responseBuffer); diff --git a/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs b/NetSharp/NetSharpExamples/Examples/Stream Network Connection Examples/StreamNetworkReaderExample.cs @@ -17,7 +17,8 @@ namespace NetSharpExamples.Examples.Stream_Network_Connection_Examples /// <inheritdoc /> public string Name { get; } = "Stream Network Reader Example"; - private static bool RequestHandler(in EndPoint remoteEndPoint, ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, Memory<byte> responseBuffer) + private static bool RequestHandler(EndPoint remoteEndPoint, in ReadOnlyMemory<byte> requestBuffer, int receivedRequestBytes, + in Memory<byte> responseBuffer) { requestBuffer.CopyTo(responseBuffer);