public void Start()
        {
            try
            {
                var signal = new ManualResetEvent(false);

                NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();

                IPv4InterfaceProperties selectedInterface = null;

                foreach (NetworkInterface adapter in nics)
                {
                    IPInterfaceProperties ip_properties = adapter.GetIPProperties();

                    if (adapter.GetIPProperties().MulticastAddresses.Count == 0)
                    {
                        continue; // most of VPN adapters will be skipped
                    }

                    if (OperationalStatus.Up != adapter.OperationalStatus)
                    {
                        continue; // this adapter is off or not connected
                    }

                    IPv4InterfaceProperties p = adapter.GetIPProperties().GetIPv4Properties();

                    if (null == p)
                    {
                        continue; // IPv4 is not configured on this adapter
                    }

                    selectedInterface = p;

                    break;
                }

                Console.WriteLine($"Bound to {selectedInterface.ToString()}");

                var ipAddress = "192.168.86.111";

                IPAddress  multicastAddress  = IPAddress.Parse("224.0.0.251");
                IPEndPoint multicastEndpoint = new IPEndPoint(multicastAddress, 5353);
                IPAddress  localAddress      = IPAddress.Parse(ipAddress);
                //EndPoint localEndpoint = new IPEndPoint(IPAddress.Any, 5353);
                EndPoint localEndpoint = new IPEndPoint(localAddress, 5353);

                EndPoint senderRemote = new IPEndPoint(IPAddress.Any, 0);

                using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp))
                {
                    socket.EnableBroadcast     = true;
                    socket.ExclusiveAddressUse = false;
                    socket.MulticastLoopback   = true;
                    socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
                    socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastInterface, (int)IPAddress.HostToNetworkOrder(selectedInterface.Index));

                    socket.Bind(localEndpoint);

                    socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(multicastAddress, IPAddress.Any));

                    while (true)
                    {
                        try

                        {
                            var buffer = new byte[2048];
                            int numberOfbytesReceived = socket.ReceiveFrom(buffer, ref senderRemote);

                            var content = new byte[numberOfbytesReceived];
                            Array.Copy(buffer, 0, content, 0, numberOfbytesReceived);

                            ByteArrayToStringDump(content);

                            if (content[2] != 0x00)
                            {
                                Console.WriteLine("Not a query. Ignoring.");
                                continue;
                            }

                            // Build the header that indicates this is a response.
                            //
                            var outputBuffer = new byte[0];

                            var flags = new byte[2];

                            var bitArray = new BitArray(flags);

                            // We're using 15 and 10 since the Endianness of this bytes is reversed :)
                            //
                            bitArray.Set(15, true); // QR
                            bitArray.Set(10, true); // AA

                            bitArray.CopyTo(flags, 0);

                            var questionCount    = BitConverter.GetBytes((short)1).Reverse().ToArray();
                            var answerCount      = BitConverter.GetBytes((short)4).Reverse().ToArray();
                            var additionalCounts = BitConverter.GetBytes((short)1).Reverse().ToArray();
                            var otherCounts      = BitConverter.GetBytes((short)0).Reverse().ToArray();

                            // Add the header to the output buffer.
                            //
                            outputBuffer = outputBuffer.Concat(otherCounts).Concat(flags.Reverse()).Concat(questionCount).Concat(answerCount).Concat(otherCounts).Concat(additionalCounts).ToArray();

                            int endOfHeaderBufferLength = outputBuffer.Length;

                            var nodeName = GetName("_services._dns-sd._udp.local");

                            outputBuffer = outputBuffer.Concat(nodeName).ToArray();

                            var typeBytes = BitConverter.GetBytes((short)12).Reverse().ToArray(); // PTR

                            outputBuffer = outputBuffer.Concat(typeBytes).ToArray();

                            var @class = BitConverter.GetBytes((short)1).Reverse().ToArray(); // Internet

                            outputBuffer = outputBuffer.Concat(@class).ToArray();

                            Dictionary <string, string> values = new Dictionary <string, string>();
                            values.Add("sf", "1");
                            values.Add("ff", "0x00");
                            values.Add("ci", "2");
                            values.Add("id", "C5:22:3D:E3:CE:D6");
                            values.Add("md", "Climenole");
                            values.Add("s#", "1");
                            values.Add("c#", "678");

                            outputBuffer = AddTxt(outputBuffer, "Jarvis._hap._tcp.local", values);
                            outputBuffer = AddPtr(outputBuffer, "_services._dns-sd._udp.local", "_hap._tcp.local");
                            outputBuffer = AddPtr(outputBuffer, "_hap._tcp.local", "Jarvis._hap._tcp.local");
                            outputBuffer = AddSrv(outputBuffer, "Jarvis._hap._tcp.local", 0, 0, 51826, "Surface.local");

                            outputBuffer = AddARecord(outputBuffer, "Surface.local", "A", ipAddress);

                            ByteArrayToStringDump(outputBuffer);

                            Thread.Sleep(50);

                            var bytesSent = socket.SendTo(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, senderRemote);

                            Console.WriteLine($"Wrote {bytesSent}");
                        }
                        catch (Exception exp)
                        {
                            Console.WriteLine(exp.Message);
                        }
                    }
                }
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.Message);

                if (exp.InnerException != null)
                {
                    Console.WriteLine(exp.InnerException.Message);
                }
            }
        }