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.58 KB | None | 0 0
  1. using System;
  2.  
  3. namespace NetSharp.Packets
  4. {
  5. public readonly struct NetworkPacket
  6. {
  7. public const int TotalSize = 4096;
  8.  
  9. public const int HeaderSize = NetworkPacketHeader.TotalSize;
  10.  
  11. public const int FooterSize = NetworkPacketFooter.TotalSize;
  12.  
  13. public const int DataSize = TotalSize - HeaderSize - FooterSize;
  14.  
  15. public readonly ReadOnlyMemory<byte> Data;
  16.  
  17. public readonly NetworkPacketHeader Header;
  18.  
  19. public readonly NetworkPacketFooter Footer;
  20.  
  21. /// <summary>
  22. /// Constructs a new instance of the <see cref="NetworkPacket"/> struct.
  23. /// </summary>
  24. /// <param name="packetHeader">The header for this packet.</param>
  25. /// <param name="packetDataBuffer">The data that should be stored in the packet.</param>
  26. /// <param name="packetFooter">The footer for this packet.</param>
  27. /// <exception cref="ArgumentException">
  28. /// Thrown when the given <paramref name="packetDataBuffer"/> exceeds <see cref="TotalSize"/> bytes in size.
  29. /// </exception>
  30. private NetworkPacket(NetworkPacketHeader packetHeader, ReadOnlyMemory<byte> packetDataBuffer, NetworkPacketFooter packetFooter)
  31. {
  32. if (packetDataBuffer.Length > DataSize)
  33. {
  34. throw new ArgumentException(
  35. $"Given buffer exceeds {TotalSize} bytes, and cannot fit into a network packet",
  36. nameof(packetDataBuffer));
  37. }
  38.  
  39. Data = packetDataBuffer;
  40. }
  41.  
  42. public static NetworkPacket Deserialise(ReadOnlyMemory<byte> buffer)
  43. {
  44. ReadOnlyMemory<byte> serialisedPacketHeader = buffer.Slice(0, HeaderSize);
  45. NetworkPacketHeader packetHeader = NetworkPacketHeader.Deserialise(serialisedPacketHeader);
  46.  
  47. ReadOnlyMemory<byte> packetDataBuffer = buffer.Slice(HeaderSize, DataSize);
  48.  
  49. ReadOnlyMemory<byte> serialisedPacketFooter = buffer.Slice(HeaderSize + DataSize, FooterSize);
  50. NetworkPacketFooter packetFooter = NetworkPacketFooter.Deserialise(serialisedPacketFooter);
  51.  
  52. return new NetworkPacket(packetHeader, packetDataBuffer, packetFooter);
  53. }
  54.  
  55. public static void Serialise(NetworkPacket instance, Memory<byte> buffer)
  56. {
  57. Memory<byte> packetHeader = buffer.Slice(0, HeaderSize);
  58. NetworkPacketHeader.Serialise(instance.Header, packetHeader);
  59.  
  60. Memory<byte> packetDataBuffer = buffer.Slice(HeaderSize, DataSize);
  61. instance.Data.CopyTo(packetDataBuffer);
  62.  
  63. Memory<byte> packetFooter = buffer.Slice(HeaderSize + DataSize, FooterSize);
  64. NetworkPacketFooter.Serialise(instance.Footer, packetFooter);
  65. }
  66.  
  67. public readonly struct NetworkPacketHeader
  68. {
  69. public const int TotalSize = 0;
  70.  
  71. public static NetworkPacketHeader Deserialise(ReadOnlyMemory<byte> buffer)
  72. {
  73. return new NetworkPacketHeader();
  74. }
  75.  
  76. public static void Serialise(NetworkPacketHeader instance, Memory<byte> buffer)
  77. {
  78. }
  79. }
  80.  
  81. public readonly struct NetworkPacketFooter
  82. {
  83. public const int TotalSize = 0;
  84.  
  85. public static NetworkPacketFooter Deserialise(ReadOnlyMemory<byte> buffer)
  86. {
  87. return new NetworkPacketFooter();
  88. }
  89.  
  90. public static void Serialise(NetworkPacketFooter instance, Memory<byte> buffer)
  91. {
  92. }
  93. }
  94. }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement