protected override Task<int> Send(UdpMessage message)
 {
     if (Logger.IsDebugEnabled)
     {
         Logger.Debug(string.Format("SEND {0}, PacketType {1}, Size {2}", message.RemoteEndPoint, message.PacketType, message.Message.Count()));
     }
     return base.Send(message);
 }
 public static UdpMessage ToUdpMessage(this byte[] message, IPEndPoint endPoint)
 {
     using (var stream = new MemoryStream(message))
     {
         using (var binaryReader = new BinaryReader(stream))
         {
             var udpMsg = new UdpMessage(endPoint)
             {
                 Message = message,
                 PacketType = binaryReader.ReadByte(),
                 Flags = binaryReader.ReadByte(),
                 Session = binaryReader.ReadUInt16(),
                 Key = binaryReader.ReadUInt16()
             };
             return udpMsg;
         }
     }
 }
 protected virtual Task<int> Send(UdpMessage message)
 {
     return UdpClient.SendAsync(message.Message, message.Message.Length, message.RemoteEndPoint);
 }
        private void ProcessGameInfoResponse(UdpMessage message)
        {
            var gameInfo = message as GameInfoResponse;

            Logger.Info(string.Format("{0} GameInfo", gameInfo.RemoteEndPoint));

            if (serverList.ContainsKey(gameInfo.RemoteEndPoint))
            {
                serverList[gameInfo.RemoteEndPoint] = gameInfo.ServerInfo;
            }
            else
            {
                serverList.Add(gameInfo.RemoteEndPoint, gameInfo.ServerInfo);
            }
        }
        private void ProcessServerListRequest(UdpMessage message)
        {
            Logger.Info(string.Format("{0} ServerList", message.RemoteEndPoint));

            //query server list and send results back

            var session = SessionHandler.GetSession(message.RemoteEndPoint);

            if (serverList.Any())
            {
                var total = (ushort)serverList.Count;
                ushort packetIndex = 0;

                serverList.Values.ToList().ForEach(serverInfo =>
                {
                    var serverListResponse = new ServerListResponse(message.RemoteEndPoint);
                        serverListResponse.AddSession(session);

                    serverListResponse.PacketIndex = ++ packetIndex;
                    serverListResponse.TotalPackets = total;

                    serverListResponse.Message = serverListResponse.WriteUdpMessage().Concat(serverInfo.WriteUdpMessage()).ToArray();

                    Send(serverListResponse);
                });
            }
            else
            {
                var serverListResponse = new ServerListResponse(message.RemoteEndPoint);
                serverListResponse.AddSession(session);

                serverListResponse.PacketIndex = 1;
                serverListResponse.TotalPackets = 1;

                serverListResponse.Message = serverListResponse.WriteUdpMessage();

                Send(serverListResponse);
            }
        }
        private void ProcessHeartbeat(UdpMessage message)
        {
            var heartbeat = message as GameHeartbeat;

            Logger.Info(string.Format("{0} Heartbeat", heartbeat.RemoteEndPoint));

            if (SessionHandler.Heartbeat(heartbeat.RemoteEndPoint))
            {
                var session = SessionHandler.GetSession(heartbeat.RemoteEndPoint);

                //send game info request
                var gameInfoReq = new GameInfoRequest(heartbeat.RemoteEndPoint );
                gameInfoReq.AddSession(session);

                gameInfoReq.Message = gameInfoReq.WriteUdpMessage();

                Send(gameInfoReq);
            }
        }