Advertisement
Guest User

Untitled

a guest
Apr 9th, 2020
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.96 KB | None | 0 0
  1. protected override async Task HandleClient(SocketAsyncEventArgs clientArgs, CancellationToken cancellationToken = default)
  2. {
  3. EndPoint clientEndPoint = clientArgs.RemoteEndPoint;
  4. RemoteDatagramClientToken clientToken = connectedClientTokens[clientEndPoint];
  5.  
  6. byte[] responseBuffer = new byte[NetworkPacket.TotalSize];
  7. Memory<byte> responseBufferMemory = new Memory<byte>(responseBuffer);
  8.  
  9. try
  10. {
  11. while (!cancellationToken.IsCancellationRequested)
  12. {
  13. NetworkPacket request = await clientToken.PacketReader.ReadAsync(cancellationToken);
  14.  
  15. // TODO implement actual request handling, besides just an echo
  16. NetworkPacket response = request;
  17.  
  18. NetworkPacket.Serialise(response, responseBufferMemory);
  19.  
  20. TransmissionResult sendResult =
  21. await SocketAsyncOperations
  22. .SendToAsync(clientArgs, connection, clientEndPoint, SocketFlags.None, responseBufferMemory, cancellationToken);
  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. }
  33. catch (OperationCanceledException) { }
  34. finally
  35. {
  36. DestroyConnectionArgs(clientArgs);
  37. }
  38. }
  39.  
  40. public override async Task RunAsync(CancellationToken cancellationToken = default)
  41. {
  42. byte[] requestBuffer = new byte[NetworkPacket.TotalSize];
  43. Memory<byte> requestBufferMemory = new Memory<byte>(requestBuffer);
  44.  
  45. EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
  46. using SocketAsyncEventArgs remoteArgs = GenerateConnectionArgs(remoteEndPoint);
  47.  
  48. while (!cancellationToken.IsCancellationRequested)
  49. {
  50. remoteArgs.RemoteEndPoint = remoteEndPoint;
  51.  
  52. TransmissionResult receiveResult =
  53. await SocketAsyncOperations
  54. .ReceiveFromAsync(remoteArgs, connection, remoteEndPoint, SocketFlags.None, requestBufferMemory, cancellationToken)
  55. .ConfigureAwait(false);
  56.  
  57. EndPoint clientEndPoint = receiveResult.RemoteEndPoint;
  58.  
  59. #if DEBUG
  60. lock (typeof(Console))
  61. {
  62. Console.WriteLine($"[Server] Received {receiveResult.Count} bytes from {receiveResult.RemoteEndPoint}");
  63. Console.WriteLine($"[Server] <<<< {Encoding.UTF8.GetString(receiveResult.Buffer.Span)}");
  64. }
  65. #endif
  66.  
  67. if (!ConnectedClientHandlerTasks.ContainsKey(clientEndPoint))
  68. {
  69. SocketAsyncEventArgs clientArgs = GenerateConnectionArgs(receiveResult.RemoteEndPoint);
  70.  
  71. BoundedChannelOptions clientChannelOptions = new BoundedChannelOptions(60)
  72. { FullMode = BoundedChannelFullMode.DropOldest, SingleReader = true, SingleWriter = true };
  73. Channel<NetworkPacket> clientChannel = Channel.CreateBounded<NetworkPacket>(clientChannelOptions);
  74.  
  75. connectedClientTokens[clientEndPoint] = new RemoteDatagramClientToken(in clientChannel);
  76.  
  77. ConnectedClientHandlerTasks[clientEndPoint] = HandleClient(clientArgs, cancellationToken);
  78. }
  79.  
  80. NetworkPacket requestPacket = NetworkPacket.Deserialise(requestBufferMemory);
  81.  
  82. await connectedClientTokens[clientEndPoint].PacketWriter.WriteAsync(requestPacket, cancellationToken);
  83. }
  84.  
  85. /*
  86. while (true)
  87. {
  88. TransmissionResult receiveResult =
  89. await SocketAsyncEventArgs.ReceiveAsync(remoteEndPoint, SocketFlags.None, requestBufferMemory);
  90.  
  91. #if DEBUG
  92. lock (typeof(Console))
  93. {
  94. Console.WriteLine($"[Server] Received {receiveResult.Count} bytes from {receiveResult.RemoteEndPoint}");
  95. Console.WriteLine($"[Server] <<<< {Encoding.UTF8.GetString(receiveResult.Buffer.Span)}");
  96. }
  97. #endif
  98.  
  99. TransmissionResult sendResult =
  100. await SocketAsyncOperations.SendAsync(receiveResult.RemoteEndPoint, SocketFlags.None, requestBuffer);
  101.  
  102. #if DEBUG
  103. lock (typeof(Console))
  104. {
  105. Console.WriteLine($"[Server] Sent {sendResult.Count} bytes to {sendResult.RemoteEndPoint}");
  106. Console.WriteLine($"[Server] >>>> {Encoding.UTF8.GetString(sendResult.Buffer.Span)}");
  107. }
  108. #endif
  109. }
  110. */
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement