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:
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);