Packets.cs (2050B)
1 using System; 2 using System.Text; 3 4 using System.Runtime.InteropServices; 5 6 namespace NetworkingDemo.Packets { 7 internal enum PacketType : int { 8 Welcome, 9 Ping, 10 Pong, 11 } 12 13 interface IPacket { 14 PacketType Type(); 15 int MaxSerializedLength(); 16 int SerializeInto(Memory<byte> buffer); 17 bool TryDeserializeFrom(Memory<byte> buffer); 18 } 19 20 struct WelcomePacket : IPacket { 21 internal string Msg; 22 23 internal WelcomePacket(string msg) { Msg = msg; } 24 25 public PacketType Type() { 26 return PacketType.Welcome; 27 } 28 29 public int MaxSerializedLength() { 30 return Encoding.UTF8.GetMaxByteCount(Msg.Length); 31 } 32 33 public int SerializeInto(Memory<byte> buffer) { 34 return Encoding.UTF8.GetBytes(Msg, buffer.Span); 35 } 36 37 public bool TryDeserializeFrom(Memory<byte> buffer) { 38 char[] chars = new char[Encoding.UTF8.GetCharCount(buffer.Span)]; 39 40 Span<char> span = chars; 41 Encoding.UTF8.GetChars(buffer.Span, span); 42 43 Msg = span.ToString(); 44 45 return true; 46 } 47 } 48 49 internal struct PingPacket : IPacket { 50 internal int Value; 51 52 internal PingPacket(int value) { Value = value; } 53 54 public PacketType Type() { 55 return PacketType.Ping; 56 } 57 58 public int MaxSerializedLength() { 59 return sizeof(int); 60 } 61 62 public int SerializeInto(Memory<byte> buffer) { 63 MemoryMarshal.Write(buffer.Span.Slice(0, sizeof(int)), ref Value); 64 return sizeof(int); 65 } 66 67 public bool TryDeserializeFrom(Memory<byte> buffer) { 68 Value = MemoryMarshal.Read<int>(buffer.Span.Slice(0, sizeof(int))); 69 return true; 70 } 71 } 72 73 internal struct PongPacket : IPacket { 74 internal int Value; 75 76 internal PongPacket(int value) { Value = value; } 77 78 public PacketType Type() { 79 return PacketType.Pong; 80 } 81 82 public int MaxSerializedLength() { 83 return sizeof(int); 84 } 85 86 public int SerializeInto(Memory<byte> buffer) { 87 MemoryMarshal.Write(buffer.Span.Slice(0, sizeof(int)), ref Value); 88 return sizeof(int); 89 } 90 91 public bool TryDeserializeFrom(Memory<byte> buffer) { 92 Value = MemoryMarshal.Read<int>(buffer.Span.Slice(0, sizeof(int))); 93 return true; 94 } 95 } 96 }