/// <summary>Tries to decode the specified packet.</summary>
        /// <param name="e">The <see cref="UdpPacketEventArgs"/> instance containing the event data.</param>
        /// <param name="result">The result.</param>
        /// <returns></returns>
        public static bool TryDecode(UdpPacketEventArgs e, out MDBBroadcastResult result)
        {
            result = null;
            int size = e.Packet.Size;

            byte[] data = e.Packet.Data;
            if (data.Length > size)
            {
                data = data.GetRange(0, size);
            }

            if (!e.Packet.Data.StartsWith("[MDB]"))
            {
                data = data.Gunzip();
                size = data.Length;
            }
            string content = Encoding.UTF8.GetString(data, 0, size);
            var    reader  = IniReader.Parse("mdb", content);

            if (reader.ReadSetting("MDB", "Version") != "4.0")
            {
                return(false);
            }
            result = new MDBBroadcastResult()
            {
                LastSeen       = DateTime.Now,
                Search         = reader.ReadBool("MDB", "Search", false),
                StreamBasePort = reader.ReadInt32("MDB", "Streams", 0),
                Ports          = reader.ReadSection("Ports").Select(p => int.Parse(p)).ToList(),
                Addresses      = reader.ReadSection("Addresses").Select(ip => IPAddress.Parse(ip)).ToList(),
                Host           = reader.ReadSetting("MDB", "Host")
            };
            return(true);
        }
Exemplo n.º 2
0
 void SendAnswer(object sender, UdpPacketEventArgs e)
 {
     lock (this)
     {
         if (DateTime.Now > nextSend)
         {
             if (e.Packet.Data.StartsWith("[MDB]"))
             {
                 var  reader   = IniReader.Parse("request", e.Packet.Data);
                 bool isSearch = reader.ReadBool("MDB", "Search", false);
                 if (isSearch)
                 {
                     this.LogDebug("Answering search of {0}", e.Packet.RemoteEndPoint);
                     try
                     {
                         if (DateTime.Now > nextUpdate)
                         {
                             UpdateConfig();
                             nextUpdate = DateTime.Now.AddSeconds(10);
                         }
                         sock.Send(config);
                         nextSend = DateTime.Now.AddSeconds(1);
                     }
                     catch (Exception ex)
                     {
                         this.LogError(ex, "Could not send broadcast answer to {0}", e.Packet.RemoteEndPoint);
                     }
                 }
             }
         }
     }
 }
 /// <summary>Decodes the specified udp packet.</summary>
 /// <param name="e">The <see cref="UdpPacketEventArgs"/> instance containing the event data.</param>
 /// <returns></returns>
 public static MDBBroadcastResult Decode(UdpPacketEventArgs e)
 {
     if (TryDecode(e, out MDBBroadcastResult result))
     {
         return(result);
     }
     throw new Exception("Invalid package data.");
 }