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