// unpack a message we received public static T UnpackFromByteArray <T>(byte[] data) where T : struct, NetworkMessage { using (NetworkReaderPooled networkReader = NetworkReaderPool.Get(data)) { int msgType = MessagePacking.GetId <T>(); int id = networkReader.ReadUShort(); if (id != msgType) { throw new FormatException($"Invalid message, could not unpack {typeof(T).FullName}"); } return(networkReader.Read <T>()); } }
async Task ReceiveGameBroadcastAsync(UdpClient udpClient) { // only proceed if there is available data in network buffer, or otherwise Receive() will block // average time for UdpClient.Available : 10 us UdpReceiveResult udpReceiveResult = await udpClient.ReceiveAsync(); using (NetworkReaderPooled networkReader = NetworkReaderPool.Get(udpReceiveResult.Buffer)) { if (networkReader.ReadLong() != secretHandshake) { return; } Response response = networkReader.Read <Response>(); ProcessResponse(response, udpReceiveResult.RemoteEndPoint); } }
async Task ReceiveRequestAsync(UdpClient udpClient) { // only proceed if there is available data in network buffer, or otherwise Receive() will block // average time for UdpClient.Available : 10 us UdpReceiveResult udpReceiveResult = await udpClient.ReceiveAsync(); using (NetworkReaderPooled networkReader = NetworkReaderPool.Get(udpReceiveResult.Buffer)) { long handshake = networkReader.ReadLong(); if (handshake != secretHandshake) { // message is not for us throw new ProtocolViolationException("Invalid handshake"); } Request request = networkReader.Read <Request>(); ProcessClientRequest(request, udpReceiveResult.RemoteEndPoint); } }