From 1040fccaef630b401fe31523ef40705e578bc482 Mon Sep 17 00:00:00 2001 From: Richard Schneider Date: Mon, 15 Jul 2019 16:15:12 +1200 Subject: [PATCH 1/3] feat(MulticastService): add MalformedMessage event --- src/MulticastService.cs | 15 ++++++++++++++- test/MulticastServiceTest.cs | 17 +++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/MulticastService.cs b/src/MulticastService.cs index 287a137..afae2cb 100644 --- a/src/MulticastService.cs +++ b/src/MulticastService.cs @@ -104,6 +104,14 @@ static MulticastService() /// public event EventHandler AnswerReceived; + /// + /// Raised when a DNS message is received that cannot be decoded. + /// + /// + /// The DNS message as a byte array. + /// + public event EventHandler MalformedMessage; + /// /// Raised when one or more network interfaces are discovered. /// @@ -603,8 +611,12 @@ void Send(Message msg, bool checkDuplicate, IPEndPoint remoteEndPoint = null) /// Multicast DNS messages received with an OPCODE or RCODE other than zero /// are silently ignored. /// + /// + /// If the message cannot be decoded, then the + /// event is raised. + /// /// - void OnDnsMessage(object sender, UdpReceiveResult result) + public void OnDnsMessage(object sender, UdpReceiveResult result) { // If recently received, then ignore. if (!receivedMessages.TryAdd(result.Buffer)) @@ -620,6 +632,7 @@ void OnDnsMessage(object sender, UdpReceiveResult result) catch (Exception e) { log.Warn("Received malformed message", e); + MalformedMessage?.Invoke(this, result.Buffer); return; // eat the exception } diff --git a/test/MulticastServiceTest.cs b/test/MulticastServiceTest.cs index d868ab9..9bfb392 100644 --- a/test/MulticastServiceTest.cs +++ b/test/MulticastServiceTest.cs @@ -624,5 +624,22 @@ public void Multiple_Listeners() Assert.IsTrue(ready2.WaitOne(TimeSpan.FromSeconds(1)), "ready2 timeout"); } } + + [TestMethod] + public void MalformedMessage() + { + byte[] malformedMessage = null; + using (var mdns = new MulticastService()) + { + mdns.MalformedMessage += (s, e) => malformedMessage = e; + + var msg = new byte[] { 0xff }; + var endPoint = new IPEndPoint(IPAddress.Loopback, 5353); + var udp = new UdpReceiveResult(msg, endPoint); + mdns.OnDnsMessage(this, udp); + + CollectionAssert.AreEqual(msg, malformedMessage); + } + } } } From e487a7eb80f6097e4e407531f0520f2668a0eeca Mon Sep 17 00:00:00 2001 From: Richard Schneider Date: Mon, 15 Jul 2019 16:36:08 +1200 Subject: [PATCH 2/3] test(DuplicateResponse): event handler should be sync --- test/MulticastServiceTest.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/MulticastServiceTest.cs b/test/MulticastServiceTest.cs index 9bfb392..9c25936 100644 --- a/test/MulticastServiceTest.cs +++ b/test/MulticastServiceTest.cs @@ -529,10 +529,10 @@ public async Task DuplicateResponse() using (var mdns = new MulticastService()) { var answerCount = 0; - mdns.NetworkInterfaceDiscovered += async (s, e) => + mdns.NetworkInterfaceDiscovered += (s, e) => { mdns.SendQuery(service); - await Task.Delay(250); + Thread.Sleep(250); mdns.SendQuery(service); }; mdns.QueryReceived += (s, e) => @@ -572,10 +572,10 @@ public async Task NoDuplicateResponse() using (var mdns = new MulticastService()) { var answerCount = 0; - mdns.NetworkInterfaceDiscovered += async (s, e) => + mdns.NetworkInterfaceDiscovered += (s, e) => { mdns.SendQuery(service); - await Task.Delay(2000); + Thread.Sleep(2000); mdns.SendQuery(service); }; mdns.QueryReceived += (s, e) => @@ -601,7 +601,7 @@ public async Task NoDuplicateResponse() }; }; mdns.Start(); - await Task.Delay(3000); + await Task.Delay(5000); Assert.AreEqual(2, answerCount); } } From d479d164f7d3fe0a54e8cb0cc5138c6384e398f6 Mon Sep 17 00:00:00 2001 From: Richard Schneider Date: Mon, 15 Jul 2019 16:55:16 +1200 Subject: [PATCH 3/3] feat(traffic): a program to log MDNS traffic --- Mdns.sln | 6 ++++++ traffic/Program.cs | 43 ++++++++++++++++++++++++++++++++++++++++++ traffic/traffic.csproj | 12 ++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 traffic/Program.cs create mode 100644 traffic/traffic.csproj diff --git a/Mdns.sln b/Mdns.sln index 38ccd08..b1df419 100644 --- a/Mdns.sln +++ b/Mdns.sln @@ -24,6 +24,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spike", "Spike\Spike.csproj EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Browser", "Browser\Browser.csproj", "{A77BEF8C-440E-46F7-ACFC-5EF06EFCA4BA}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "traffic", "traffic\traffic.csproj", "{5E51D502-05E1-4A45-A8D6-6FB3E295D798}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -48,6 +50,10 @@ Global {A77BEF8C-440E-46F7-ACFC-5EF06EFCA4BA}.Debug|Any CPU.Build.0 = Debug|Any CPU {A77BEF8C-440E-46F7-ACFC-5EF06EFCA4BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {A77BEF8C-440E-46F7-ACFC-5EF06EFCA4BA}.Release|Any CPU.Build.0 = Release|Any CPU + {5E51D502-05E1-4A45-A8D6-6FB3E295D798}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5E51D502-05E1-4A45-A8D6-6FB3E295D798}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E51D502-05E1-4A45-A8D6-6FB3E295D798}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5E51D502-05E1-4A45-A8D6-6FB3E295D798}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/traffic/Program.cs b/traffic/Program.cs new file mode 100644 index 0000000..6793482 --- /dev/null +++ b/traffic/Program.cs @@ -0,0 +1,43 @@ +using Makaretu.Dns; +using System; + +namespace traffic +{ + class Program + { + static readonly object ttyLock = new object(); + + static void Main(string[] args) + { + var mdns = new MulticastService(); + mdns.NetworkInterfaceDiscovered += (s, e) + => mdns.SendQuery(ServiceDiscovery.ServiceName, type: DnsType.PTR); + mdns.AnswerReceived += OnGoodDnsMessage; + mdns.QueryReceived += OnGoodDnsMessage; + mdns.MalformedMessage += OnBadDnsMessage; + mdns.Start(); + Console.ReadKey(); + } + + private static void OnBadDnsMessage(object sender, byte[] packet) + { + lock (ttyLock) + { + Console.WriteLine(">>> {0:O} <<<", DateTime.Now); + Console.WriteLine("Malformed message (base64)"); + Console.WriteLine(Convert.ToBase64String(packet)); + } + + Environment.Exit(1); + } + + private static void OnGoodDnsMessage(object sender, MessageEventArgs e) + { + lock (ttyLock) + { + Console.WriteLine("=== {0:O} ===", DateTime.Now); + Console.WriteLine(e.Message.ToString()); + } + } + } +} diff --git a/traffic/traffic.csproj b/traffic/traffic.csproj new file mode 100644 index 0000000..c61a9f0 --- /dev/null +++ b/traffic/traffic.csproj @@ -0,0 +1,12 @@ + + + + Exe + netcoreapp2.2 + + + + + + +