示例#1
0
        protected virtual bool SuperiorAcquired(DnsRequest request, Action<BufferSegment, DnsResponse> answer)
        {
            Socket dns = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            try
            {
                dns.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1500);
                foreach (IPEndPoint dnsServer in this.m_dnsServer)
                {
                    dns.SendTo(request.Message.Buffer,
                        request.Message.Offset,
                        request.Message.Length, SocketFlags.None, dnsServer);
                }
                byte[] response_data = new byte[Layer3Netif.MTU];

                EndPoint server = dns.LocalEndPoint;
                dns.BeginReceiveFrom(response_data, 0,
                     response_data.Length, SocketFlags.None, ref server, (ar) =>
                     {
                         using (dns)
                         {
                             do
                             {
                                 try
                                 {
                                     int response_length = dns.EndReceiveFrom(ar, ref server);
                                     if (response_length <= 0)
                                     {
                                         break;
                                     }

                                     DnsResponse response = DnsResponse.From(response_data, response_length);
                                     if (response == null)
                                     {
                                         break;
                                     }

                                     answer?.Invoke(new BufferSegment(response_data, 0, response_length), response);
                                 }
                                 catch (Exception) { }
                             } while (false);
                             dns.Close();
                         }
                     }, null);
                return true;
            }
            catch (Exception)
            {
                dns.Close();
                dns.Dispose();
                return false;
            }
        }