private DNSResponse UdpRequest(DNSRequest request, List<IPEndPoint> dnsServers, int timeout)
{
// RFC1035 max. size of a UDP datagram is 512 bytes
byte[] responseMessage = new byte[512];
IPEndPoint activeDNSServer = GetActiveDNSServer();
//for (int intAttempts = 0; intAttempts < m_Retries; intAttempts++)
//{
// for (int intDnsServer = 0; intDnsServer < dnsServers.Count; intDnsServer++)
// {
string requestStr = request.Questions[0].QType + " " + request.Questions[0].QName;
logger.Debug("Resolver sending UDP DNS request to " + activeDNSServer + " for " + requestStr + ".");
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, timeout * 1000);
try
{
socket.SendTo(request.Data, activeDNSServer);
int intReceived = socket.Receive(responseMessage);
ResetTimeoutCount(activeDNSServer);
byte[] data = new byte[intReceived];
Array.Copy(responseMessage, data, intReceived);
DNSResponse response = new DNSResponse(activeDNSServer, data);
//AddToCache(response);
//logger.Debug("Success in UdpRequest for " + requestStr + ".");
return response;
}
catch (SocketException sockExcp)
{
//logger.Debug("SocketException UdpRequest for " + requestStr + ". " + sockExcp.Message);
IncrementTimeoutCount(activeDNSServer);
logger.Warn("Resolver connection to nameserver " + activeDNSServer + " failed. " + sockExcp.Message);
//continue; // next try
}
catch (Exception excp)
{
logger.Error("Exception Resolver UdpRequest for " + requestStr + ". " + excp.Message);
}
finally
{
m_Unique++;
// close the socket
socket.Close();
}
// }
//}
logger.Warn("Resolver UDP request timed out for " + requestStr + ".");
DNSResponse responseTimeout = new DNSResponse();
responseTimeout.Timedout = true;
return responseTimeout;
}