/// <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); }
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."); }