networking-demo

networking-demo.git
git clone git://git.lenczewski.org/networking-demo.git
Log | Files | Refs | README

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 }