示例#1
0
        public MdnsRecord Query(string serviceName)
        {
            byte[] data = MdnsQuery.Create(serviceName);

            var        _client = CreateClient();
            MdnsRecord rec     = null;
            bool       worked  = false;

            _client.Send(data, data.Length, new IPEndPoint(IPAddress.Parse(MdnsListener.MDNS_IP), MdnsListener.MDNS_PORT));

            while (!worked)
            {
                try
                {
                    var    endpoint = new IPEndPoint(IPAddress.Any, MdnsListener.MDNS_PORT);
                    byte[] qData    = _client.Receive(ref endpoint);
                    var    record   = new MdnsRecord(qData);
                    if (record.Domain.Replace(".local", "") == serviceName)
                    {
                        rec    = record;
                        worked = true;
                    }
                }
                catch { }
            }
            return(rec);
        }
示例#2
0
        /// <summary>
        /// This method handles the actual listening on the socket. Any messages are then
        /// sent off to another thread for dispatch.
        /// </summary>
        private void SocketListener()
        {
            while (_keepListening)
            {
                try
                {
                    var    tEndpoint = new IPEndPoint(_endpoint.Address, _endpoint.Port);
                    byte[] msg       = _client.Receive(ref tEndpoint);


                    MdnsQuery query = null;
                    try
                    {
                        query = new MdnsQuery(tEndpoint, msg);
                    }
                    catch {}

                    // If an MDNS query is received, but no one is listening, does it make any sound?
                    if (query != null && QueryReceived != null)
                    {
                        QueryReceived(this, query);
                    }
                }
                catch { }
            }

            _keepListening = true;
        }
示例#3
0
 void Listener_QueryReceived(object sender, MdnsQuery query)
 {
     foreach (MdnsNet.DNS.QueryQuestion question in query.Questions)
     {
         string domain = question.Name.Name;
         if (ResolverDatabase.ContainsKey(domain.Replace(".local", "")))
         {
             this.Listener.SendResponse(query.RemoteEndpoint, ResolverDatabase[domain.Replace(".local", "")]);
         }
     }
 }
示例#4
0
        public List <MdnsRecord> QueryAll(string serviceName, int timeout)
        {
            byte[] payload = MdnsQuery.Create(serviceName);
            var    _client = CreateClient();


            List <MdnsRecord> records = new List <MdnsRecord>();
            bool KeepSearching        = true;
            var  now = DateTime.Now;

            var queryThread = new System.Threading.Thread(() =>
            {
                _client.Send(payload, payload.Length, new IPEndPoint(IPAddress.Parse(MdnsListener.MDNS_IP), MdnsListener.MDNS_PORT));

                while (KeepSearching)
                {
                    try
                    {
                        var endpoint   = new IPEndPoint(IPAddress.Any, MdnsListener.MDNS_PORT);
                        byte[] recData = _client.Receive(ref endpoint);
                        var record     = new MdnsRecord(recData);
                        if (record.Domain.Replace(".local", "") == serviceName)
                        {
                            records.Add(record);
                        }
                    }
                    catch { }
                }
            });

            queryThread.Start();

            while ((DateTime.Now - now).TotalSeconds < timeout)
            {
                ;
            }

            try
            {
                queryThread.Abort();
                queryThread = null;
            }
            catch {}
            return(new List <MdnsRecord>(records));
        }
示例#5
0
        public async Task <MdnsRecord> QueryAsync(string serviceName)
        {
            byte[] data = MdnsQuery.Create(serviceName);

            var _client = CreateClient();


            MdnsRecord rec = null;

            await Task.Factory.StartNew(() =>
            {
                bool worked = false;
                _client.Send(data, data.Length, new IPEndPoint(IPAddress.Parse(MdnsListener.MDNS_IP), MdnsListener.MDNS_PORT));
                DateTime now = DateTime.Now;
                while (!worked)
                {
                    try
                    {
                        var endpoint = new IPEndPoint(IPAddress.Any, MdnsListener.MDNS_PORT);
                        byte[] qData = _client.Receive(ref endpoint);
                        var record   = new MdnsRecord(qData);
                        if (record.Domain.Replace(".local", "") == serviceName)
                        {
                            rec    = record;
                            worked = true;
                        }
                    }
                    catch { }
                }
            });


            if (rec == null)
            {
                throw new Exception("The timeout period was exceeded while waiting for a response for \"" + serviceName + "\".");
            }

            return(rec);
        }