private void OnQueryTimerElapsed(object obj) { lock (this) { QueryParameters queryParameters = ServiceBrowser.QueryParameters; DateTime now = DateTime.Now; bool sendQuery = false; _lastQueryId = (ushort)_randomGenerator.Next(0, ushort.MaxValue); var writer = new DnsMessageWriter(); writer.WriteQueryHeader(_lastQueryId); foreach (var serviceKV in _serviceHandlers) { Name Name = serviceKV.Key; var ServiceInfos = serviceKV.Value.ServiceInfos; bool sendQueryForService = false; if (_queryCount < queryParameters.StartQueryCount) { sendQueryForService = true; } else { if (ServiceInfos.Count == 0) { sendQueryForService = true; } else { foreach (ServiceInfo service in ServiceInfos) { if (service.LastQueryTime <= now.AddMilliseconds(-queryParameters.QueryInterval)) { sendQueryForService = true; } } } } if (sendQueryForService) { OnServiceQuery(Name); writer.WriteQuestion(Name, RecordType.PTR); } sendQuery = sendQuery || sendQueryForService; } foreach (var hostKV in _hostInfos) { var name = hostKV.Key; var adresses = hostKV.Value.Addresses; if (hostKV.Value.Addresses == null) { writer.WriteQuestion(name, RecordType.A); writer.WriteQuestion(name, RecordType.AAAA); sendQuery = true; } } if (sendQuery) { var packets = writer.Packets; Send(packets); _queryCount++; } ScheduleQueryTimer(_queryCount >= queryParameters.StartQueryCount ? queryParameters.QueryInterval : queryParameters.StartQueryInterval); } }