Example #1
0
        /// <summary> Handle an incoming query. See if we can answer any part of it
        /// given our service infos.
        /// </summary>
        internal void HandleQuery(DNSIncoming in_Renamed, IPAddress addr, int port)
        {
            // Track known answers
            bool hostConflictDetected    = false;
            bool serviceConflictDetected = false;
            long expirationTime          = (DateTime.Now.Ticks - 621355968000000000) / 10000 + DNSConstants.KNOWN_ANSWER_TTL;

            foreach (DNSRecord answer in in_Renamed.answers)
            {
                if ((answer.GetEntryType() == DNSConstants.TYPE_A) || (answer.GetEntryType() == DNSConstants.TYPE_AAAA))
                {
                    hostConflictDetected |= answer.HandleQuery(this, expirationTime);
                }
                else
                {
                    serviceConflictDetected |= answer.HandleQuery(this, expirationTime);
                }
            }

            if (plannedAnswer != null)
            {
                plannedAnswer.Append(in_Renamed);
            }
            else
            {
                if (in_Renamed.Truncated)
                {
                    plannedAnswer = in_Renamed;
                }

                new Responder(this, in_Renamed, addr, port).start();
            }

            if (hostConflictDetected || serviceConflictDetected)
            {
                new Prober(this).start();
            }
        }