Advertisement
Guest User

Untitled

a guest
Apr 9th, 2020
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.02 KB | None | 0 0
  1. private async Task HandleClientRequest(object clientRequestObj)
  2. {
  3. SocketAsyncEventArgs clientArgs = SocketArgsPool.Get();
  4.  
  5. byte[] responseBuffer = BufferPool.Rent(NetworkPacket.TotalSize);
  6. Memory<byte> responseBufferMemory = new Memory<byte>(responseBuffer);
  7.  
  8. ClientRequest clientRequest = (ClientRequest) clientRequestObj;
  9.  
  10. NetworkPacket request = clientRequest.RequestPacket;
  11. EndPoint remoteEndPoint = clientRequest.ClientEndPoint;
  12. CancellationToken cancellationToken = clientRequest.CancellationToken;
  13.  
  14. // TODO implement actual request handling, besides just an echo
  15. NetworkPacket response = request;
  16.  
  17. NetworkPacket.Serialise(response, responseBufferMemory);
  18.  
  19. TransmissionResult sendResult =
  20. await SocketAsyncOperations
  21. .SendToAsync(clientArgs, connection, remoteEndPoint, SocketFlags.None, responseBufferMemory, cancellationToken)
  22. .ConfigureAwait(false);
  23.  
  24. #if DEBUG
  25. lock (typeof(Console))
  26. {
  27. Console.WriteLine($"[Server] Sent {sendResult.Count} bytes to {sendResult.RemoteEndPoint}");
  28. Console.WriteLine($"[Server] >>>> {Encoding.UTF8.GetString(sendResult.Buffer.Span)}");
  29. }
  30. #endif
  31.  
  32. BufferPool.Return(responseBuffer, true);
  33.  
  34. SocketArgsPool.Return(clientArgs);
  35. }
  36.  
  37. public override async Task RunAsync(CancellationToken cancellationToken = default)
  38. {
  39. EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
  40. using SocketAsyncEventArgs remoteArgs = GenerateConnectionArgs(remoteEndPoint);
  41.  
  42. byte[] requestBuffer = new byte[NetworkPacket.TotalSize];
  43. Memory<byte> requestBufferMemory = new Memory<byte>(requestBuffer);
  44.  
  45. while (!cancellationToken.IsCancellationRequested)
  46. {
  47. TransmissionResult receiveResult =
  48. await SocketAsyncOperations
  49. .ReceiveFromAsync(remoteArgs, connection, remoteEndPoint, SocketFlags.None, requestBufferMemory, cancellationToken)
  50. .ConfigureAwait(false);
  51.  
  52. EndPoint clientEndPoint = receiveResult.RemoteEndPoint;
  53.  
  54. #if DEBUG
  55. lock (typeof(Console))
  56. {
  57. Console.WriteLine($"[Server] Received {receiveResult.Count} bytes from {receiveResult.RemoteEndPoint}");
  58. Console.WriteLine($"[Server] <<<< {Encoding.UTF8.GetString(receiveResult.Buffer.Span)}");
  59. }
  60. #endif
  61.  
  62. NetworkPacket requestPacket = NetworkPacket.Deserialise(requestBufferMemory);
  63.  
  64. ClientRequest request = new ClientRequest(in requestPacket, in clientEndPoint, in cancellationToken);
  65.  
  66. await Task.Factory.StartNew(HandleClientRequest, request, cancellationToken);
  67. }
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement