private static async Task DoReceiveAsync(Socket udpSocket, ThroughputCounter throughput, CancellationToken cancelToken) { // Taking advantage of pre-pinned memory here using the .NET5 POH (pinned object heap). var buffer = GC.AllocateArray <byte>(PacketSize, true); var bufferMem = buffer.AsMemory(); while (!cancelToken.IsCancellationRequested) { try { var result = await udpSocket.ReceiveFromAsync(bufferMem); // The result tells me where it came from, and gives me the data. if (result is SocketReceiveFromResult recvResult) { throughput.Add(recvResult.ReceivedBytes); } else { break; } } catch (SocketException) { // Socket exception means we are finished. break; } } }
private static async Task DoSendAsync(Socket udpSocket, IPEndPoint destination, ThroughputCounter throughput, CancellationToken cancelToken) { // Taking advantage of pre-pinned memory here using the .NET 5 POH (pinned object heap). var buffer = GC.AllocateArray <byte>(PacketSize, true); var bufferMem = buffer.AsMemory(); // Put something approaching meaningful data in the buffer. for (var idx = 0; idx < PacketSize; idx++) { bufferMem.Span[idx] = (byte)idx; } while (!cancelToken.IsCancellationRequested) { await udpSocket.SendToAsync(destination, bufferMem); throughput.Add(bufferMem.Length); } }
private static async Task DoReceiveAsync(Socket udpSocket, ThroughputCounter throughput, CancellationToken cancelToken) { // Taking advantage of pre-pinned memory here using the .NET5 POH (pinned object heap). byte[] buffer = GC.AllocateArray <byte>(length: 65527, pinned: true); Memory <byte> bufferMem = buffer.AsMemory(); while (!cancelToken.IsCancellationRequested) { try { var result = await udpSocket.ReceiveFromAsync(bufferMem, SocketFlags.None, _blankEndpoint); throughput.Add(result.ReceivedBytes); } catch (SocketException) { // Socket exception means we are finished. break; } } }