This commit is contained in:
EonaCat 2023-02-27 22:15:41 +01:00
parent 2ba9705b66
commit 150a3f226b
11 changed files with 863 additions and 532 deletions

View File

@ -1,6 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<configuration> <configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="EonaCat.DnsTester.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<startup> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup> </startup>
<userSettings>
<EonaCat.DnsTester.Properties.Settings>
<setting name="EonaCat" serializeAs="String">
<value />
</setting>
</EonaCat.DnsTester.Properties.Settings>
</userSettings>
</configuration> </configuration>

View File

@ -14,4 +14,19 @@
<ItemGroup> <ItemGroup>
<Content Include="EonaCat.ico" /> <Content Include="EonaCat.ico" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Compile Update="Properties\Settings.Designer.cs">
<DesignTimeSharedInput>True</DesignTimeSharedInput>
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<None Update="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
</ItemGroup>
</Project> </Project>

View File

@ -1,118 +1,400 @@
using Microsoft.VisualBasic.Logging; using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Net;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms;
namespace EonaCat.DnsTester.Helpers namespace EonaCat.DnsTester.Helpers
{ {
internal class DnsHelper class DnsHelper
{ {
public static event EventHandler<string> Log; public static event EventHandler<string> OnLog;
public static async Task<DnsResponse> SendDnsQueryPacket(string dnsId, string server, int port, byte[] queryBytes)
public static void ProcessDns(string startOfUrl, string domain, int urlsTotal, Socket dnsSocket, byte[] bytesSend,
long startTime, int totalDnsToUse, ListView result)
{ {
var bytesReceived = new byte[512]; // Start the clock
var totalReceived = 0; var startTime = DateTime.Now.Ticks;
// wait for a response up to timeout var endPoint = new IPEndPoint(IPAddress.Parse(server), port);
while (totalReceived < urlsTotal * totalDnsToUse) using (var client = new UdpClient(endPoint.AddressFamily))
{ {
dnsSocket.Receive(bytesReceived); client.DontFragment = true;
client.EnableBroadcast = false;
// Check if the error is ours client.Client.ReceiveTimeout = DnsReceiveTimeout;
if ((bytesReceived[0] != bytesSend[0] || bytesReceived[1] != 0x31) && await client.SendAsync(queryBytes, queryBytes.Length, endPoint);
bytesReceived[1] != 0x32) var responseResult = await client.ReceiveAsync();
continue; DnsResponse response = ParseDnsResponsePacket(dnsId, startTime, server, responseResult.Buffer);
return response;
if (bytesReceived[2] != 0x81 || bytesReceived[3] != 0x80) continue;
// Get the time now
var stopTime = DateTime.Now.Ticks;
var deltaTime = Convert.ToString((double)(stopTime - startTime) / 10000000);
// Decode the answers
// Find the URL that was returned
int dnsId = bytesReceived[1];
var receiveString = Encoding.ASCII.GetString(bytesReceived);
var index = 12;
int startOfUrlLength = bytesReceived[index];
index++;
startOfUrl = receiveString.Substring(index, startOfUrlLength);
index += startOfUrlLength;
int domainLength = bytesReceived[index];
index++;
domain = receiveString.Substring(index, domainLength);
index += domainLength;
index += 8;
// Get the record type
int ResponseType = bytesReceived[index];
index += 9;
// Get the IP address if applicable
var ipResponse = "";
switch (ResponseType)
{
case 1:
ipResponse =
$"{Convert.ToString(bytesReceived[index])}.{Convert.ToString(bytesReceived[index + 1])}.{Convert.ToString(bytesReceived[index + 2])}.{Convert.ToString(bytesReceived[index + 3])}";
break;
case 5:
ipResponse = "CNAME";
break;
case 6:
ipResponse = "SOA";
break;
}
SetStatus($"Answer: {startOfUrl}.{domain} : {ipResponse}");
// Find the url in the list
for (int i = 0; i < result.Items.Count; i++)
{
if (result.Items[i].Text != $"{startOfUrl}.{domain}") continue;
string sDeltaTime;
switch (dnsId)
{
case 49:
result.Items[i].SubItems[1].Text = Convert.ToString(ipResponse);
sDeltaTime = Convert.ToString(deltaTime);
result.Items[i].SubItems[2].Text =
sDeltaTime.Length > 5 ? sDeltaTime.Substring(0, 5) : sDeltaTime;
result.Items[i].ForeColor = System.Drawing.Color.Red;
result.EnsureVisible(i);
result.Update();
Application.DoEvents();
result.Items[i].ForeColor = System.Drawing.Color.Black;
break;
case 50:
result.Items[i].SubItems[3].Text = Convert.ToString(ipResponse);
sDeltaTime = Convert.ToString(deltaTime);
result.Items[i].SubItems[4].Text =
sDeltaTime.Length > 5 ? sDeltaTime.Substring(0, 5) : sDeltaTime;
result.Items[i].ForeColor = System.Drawing.Color.Red;
result.EnsureVisible(i);
result.Update();
Application.DoEvents();
result.Items[i].ForeColor = System.Drawing.Color.Black;
break;
}
totalReceived++;
}
} }
} }
private static void SetStatus(string text) public static int DnsReceiveTimeout { get; set; } = 5;
public static byte[] CreateDnsQueryPacket(string domainName, DnsRecordType recordType)
{ {
Log?.Invoke(null, text); Random random = new Random();
// DNS header
ushort id = (ushort)random.Next(0, 65536);
ushort flags = (ushort)0x0100; // recursion desired
ushort qdcount = 1;
ushort ancount = 0;
ushort nscount = 0;
ushort arcount = 0;
byte[] headerBytes = new byte[]
{
(byte)(id >> 8), (byte)(id & 0xff),
(byte)(flags >> 8), (byte)(flags & 0xff),
(byte)(qdcount >> 8), (byte)(qdcount & 0xff),
(byte)(ancount >> 8), (byte)(ancount & 0xff),
(byte)(nscount >> 8), (byte)(nscount & 0xff),
(byte)(arcount >> 8), (byte)(arcount & 0xff),
};
// DNS question
string[] labels = domainName.Split('.');
byte[] qnameBytes = new byte[domainName.Length + 2];
int qnameIndex = 0;
foreach (string label in labels)
{
qnameBytes[qnameIndex++] = (byte)label.Length;
foreach (char c in label)
{
qnameBytes[qnameIndex++] = (byte)c;
}
}
qnameBytes[qnameIndex++] = 0;
byte[] qtypeBytes = new byte[] { (byte)((ushort)recordType >> 8), (byte)((ushort)recordType & 0xff) };
byte[] qclassBytes = new byte[] { 0, 1 }; // internet class
byte[] questionBytes = new byte[qnameBytes.Length + qtypeBytes.Length + qclassBytes.Length];
qnameBytes.CopyTo(questionBytes, 0);
qtypeBytes.CopyTo(questionBytes, qnameBytes.Length);
qclassBytes.CopyTo(questionBytes, qnameBytes.Length + qtypeBytes.Length);
// Combine the header and question to form the DNS query packet
byte[] queryBytes = new byte[headerBytes.Length + questionBytes.Length];
headerBytes.CopyTo(queryBytes, 0);
questionBytes.CopyTo(queryBytes, headerBytes.Length);
return queryBytes;
} }
static DnsQuestion ParseDnsQuestionRecord(byte[] queryBytes, ref int offset)
{
// Parse the DNS name
string name = ParseDnsName(queryBytes, ref offset);
if (name == null)
{
return null;
}
// Parse the DNS type and class
ushort type = (ushort)((queryBytes[offset] << 8) | queryBytes[offset + 1]);
ushort qclass = (ushort)((queryBytes[offset + 2] << 8) | queryBytes[offset + 3]);
offset += 4;
return new DnsQuestion
{
Name = name,
Type = (DnsRecordType)type,
Class = (DnsRecordClass)qclass,
};
}
static DnsResponse ParseDnsResponsePacket(string dnsId, long startTime, string server, byte[] responseBytes)
{
// Parse the DNS header
ushort id = (ushort)((responseBytes[0] << 8) | responseBytes[1]);
ushort flags = (ushort)((responseBytes[2] << 8) | responseBytes[3]);
ushort qdcount = (ushort)((responseBytes[4] << 8) | responseBytes[5]);
ushort ancount = (ushort)((responseBytes[6] << 8) | responseBytes[7]);
ushort nscount = (ushort)((responseBytes[8] << 8) | responseBytes[9]);
ushort arcount = (ushort)((responseBytes[10] << 8) | responseBytes[11]);
List<DnsQuestion> questions = new List<DnsQuestion>();
//for (int i = 0; i < qdcount; i++)
//{
// DnsQuestion question = ParseDnsQuestionRecord(responseBytes, ref offset);
// if (question != null)
// {
// questions.Add(question);
// }
//}
int offset = 12;
// Parse the DNS answer records
List<ResourceRecord> answers = new List<ResourceRecord>();
for (int i = 0; i < ancount; i++)
{
try
{
ResourceRecord answer = ParseDnsAnswerRecord(responseBytes, ref offset);
if (answer != null)
{
answers.Add(answer);
}
}
catch (Exception exception)
{
OnLog?.Invoke(null, $"Answer exception: " + exception.Message);
}
}
// Parse the DNS authority records
List<ResourceRecord> authorities = new List<ResourceRecord>();
for (int i = 0; i < nscount; i++)
{
try
{
ResourceRecord authority = ParseDnsAnswerRecord(responseBytes, ref offset);
if (authority != null)
{
authorities.Add(authority);
}
}
catch (Exception exception)
{
OnLog?.Invoke(null, $"Authority answer exception: " + exception.Message);
}
}
// Parse the DNS additional records
List<ResourceRecord> additionals = new List<ResourceRecord>();
for (int i = 0; i < arcount; i++)
{
try
{
ResourceRecord additional = ParseDnsAnswerRecord(responseBytes, ref offset);
if (additional != null)
{
additionals.Add(additional);
}
}
catch (Exception exception)
{
OnLog?.Invoke(null, $"Additional answer exception: " + exception.Message);
}
}
return new DnsResponse
{
Id = id,
StartTime = startTime,
Resolver = server,
Flags = flags,
Class = (DnsRecordClass)((flags >> 3) & 0x0f),
DnsId = dnsId,
Questions = questions,
Answers = answers,
Authorities = authorities,
Additionals = additionals,
};
}
static ResourceRecord ParseDnsAnswerRecord(byte[] responseBytes, ref int offset)
{
// Parse the DNS name
string name = ParseDnsName(responseBytes, ref offset);
if (name == null)
{
return null;
}
// Parse the DNS type, class, ttl, and data length
DnsRecordType type = (DnsRecordType)((responseBytes[offset++] << 8) | responseBytes[offset++]);
DnsRecordClass klass = (DnsRecordClass)((responseBytes[offset++] << 8) | responseBytes[offset++]);
uint ttl = (uint)((responseBytes[offset++] << 24) | (responseBytes[offset++] << 16) | (responseBytes[offset++] << 8) | responseBytes[offset++]);
ushort rdlen = (ushort)((responseBytes[responseBytes.Length - 5]));
offset += 10;
// Parse the DNS data
string data = null;
switch ((DnsRecordType)type)
{
case DnsRecordType.A:
if (rdlen != 4)
{
return null;
}
data = new IPAddress(new byte[]
{
responseBytes[offset], responseBytes[offset + 1], responseBytes[offset + 2],
responseBytes[offset + 3]
}).ToString();
offset += rdlen;
break;
case DnsRecordType.CNAME:
case DnsRecordType.NS:
data = ParseDnsName(responseBytes, ref offset);
if (data == null)
{
return null;
}
break;
case DnsRecordType.MX:
ushort preference = (ushort)((responseBytes[offset] << 8) | responseBytes[offset + 1]);
offset += 2;
string exchange = ParseDnsName(responseBytes, ref offset);
if (exchange == null)
{
return null;
}
data = $"{preference} {exchange}";
break;
case DnsRecordType.TXT:
data = Encoding.ASCII.GetString(responseBytes, offset, rdlen);
offset += rdlen;
break;
default:
offset += rdlen;
break;
}
return new ResourceRecord
{
Name = name,
Type = type,
Class = klass,
Ttl = TimeSpan.FromSeconds(ttl),
Data = data,
};
}
static string ParseDnsName(byte[] responseBytes, ref int offset)
{
StringBuilder name = new StringBuilder();
int originalOffset = offset;
while (true)
{
byte len = responseBytes[offset++];
if (len == 0)
{
break;
}
if ((len & 0xc0) == 0xc0)
{
ushort pointer = (ushort)(((len & 0x3f) << 8) | responseBytes[offset++]);
int pointerOffset = pointer & 0x3fff;
if (pointerOffset >= responseBytes.Length)
{
return null;
}
int pointerEnd = offset;
offset = pointerOffset;
if (offset < originalOffset)
{
return null;
}
name.Append(ParseDnsName(responseBytes, ref offset));
offset = pointerEnd;
break;
}
if (len > 63)
{
return null;
}
name.Append(Encoding.ASCII.GetString(responseBytes, offset, len));
offset += len;
if (responseBytes[offset - 1] != 0)
{
name.Append(".");
}
}
if (originalOffset == offset)
{
return null;
}
return name.ToString();
}
}
public class DnsQuestion
{
public string Name { get; set; }
public DnsRecordType Type { get; set; }
public DnsRecordClass Class { get; set; }
}
public class ResourceRecord
{
public string Name { get; set; }
public DnsRecordType Type { get; set; }
public string Data { get; set; }
public DnsRecordClass Class { get; set; }
public TimeSpan Ttl { get; set; }
public ushort DataLength { get; set; }
}
public class DnsResponse
{
public ushort Id { get; set; }
public ushort Flags { get; set; }
public DnsRecordClass Class { get; set; }
public List<ResourceRecord> Answers { get; set; }
public long StartTime { get; set; }
public string Resolver { get; set; }
public string DnsId { get; set; }
public List<DnsQuestion> Questions { get; set; }
public List<ResourceRecord> Authorities { get; set; }
public List<ResourceRecord> Additionals { get; set; }
}
public enum DnsRecordType : ushort
{
A = 1,
NS = 2,
CNAME = 5,
MX = 15,
TXT = 16,
AAAA = 28,
}
public enum DnsRecordClass : ushort
{
/// <summary>
/// The Internet.
/// </summary>
Internet = 1,
/// <summary>
/// The CSNET class (Obsolete - used only for examples insome obsolete RFCs).
/// </summary>
CS = 2,
/// <summary>
/// The CHAOS class.
/// </summary>
CH = 3,
/// <summary>
/// Hesiod[Dyer 87].
/// </summary>
HS = 4,
/// <summary>
/// Used in UPDATE message to signify no class.
/// </summary>
None = 254,
/// <summary>
/// Only used in QCLASS.
/// </summary>
/// <seealso cref="Question.Class"/>
ANY = 255
} }
} }

View File

@ -16,10 +16,7 @@ namespace EonaCat.DnsTester.Helpers
public static void GetRandomUrls(ref List<string> urlList, int totalUrls) public static void GetRandomUrls(ref List<string> urlList, int totalUrls)
{ {
// Generate a cryptographically strong random string var letters = GetRandomLetters();
byte[] randomBytes = new byte[32];
_randomNumberGenerator.GetBytes(randomBytes);
string letters = Convert.ToBase64String(randomBytes);
Dictionary<string, string> searchEngineUrls = new Dictionary<string, string> Dictionary<string, string> searchEngineUrls = new Dictionary<string, string>
{ {
@ -81,14 +78,27 @@ namespace EonaCat.DnsTester.Helpers
} }
catch (Exception ex) catch (Exception ex)
{ {
searchEngineUrls.Remove(searchEngine.Key);
SetStatus($"{searchEngine.Key}: {ex.Message}"); SetStatus($"{searchEngine.Key}: {ex.Message}");
} }
finally
{
letters = GetRandomLetters();
}
} }
urlList = localCleanNames; // Update the reference to the list urlList = localCleanNames; // Update the reference to the list
SetStatus($"{urlList.Count} Random URL's found"); SetStatus($"{urlList.Count} Random URL's found");
} }
private static string GetRandomLetters()
{
// Generate a cryptographically strong random string
byte[] randomBytes = new byte[32];
_randomNumberGenerator.GetBytes(randomBytes);
return Convert.ToBase64String(randomBytes);
}
private static void SetStatus(string text) private static void SetStatus(string text)
{ {
Log?.Invoke(null, text); Log?.Invoke(null, text);

View File

@ -6,7 +6,7 @@
/// Required designer variable. /// Required designer variable.
/// </summary> /// </summary>
private System.ComponentModel.IContainer components = null; private System.ComponentModel.IContainer components = null;
/// <summary> /// <summary>
/// Clean up any resources being used. /// Clean up any resources being used.
/// </summary> /// </summary>
@ -29,360 +29,353 @@
private void InitializeComponent() private void InitializeComponent()
{ {
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
this.ResultView = new System.Windows.Forms.ListView(); ResultView = new System.Windows.Forms.ListView();
this.WebName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); WebName = new System.Windows.Forms.ColumnHeader();
this.DNS1IP = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); DNS1IP = new System.Windows.Forms.ColumnHeader();
this.DNS1Timing = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); DNS1Timing = new System.Windows.Forms.ColumnHeader();
this.DNS2IP = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); DNS2IP = new System.Windows.Forms.ColumnHeader();
this.DNS2Timing = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); DNS2Timing = new System.Windows.Forms.ColumnHeader();
this.RunTest = new System.Windows.Forms.Button(); RunTest = new System.Windows.Forms.Button();
this.lblDns1 = new System.Windows.Forms.Label(); lblDns1 = new System.Windows.Forms.Label();
this.lblDns2 = new System.Windows.Forms.Label(); lblDns2 = new System.Windows.Forms.Label();
this.dnsList1 = new System.Windows.Forms.ComboBox(); dnsList1 = new System.Windows.Forms.ComboBox();
this.dnsList2 = new System.Windows.Forms.ComboBox(); dnsList2 = new System.Windows.Forms.ComboBox();
this.UseCustomServers = new System.Windows.Forms.CheckBox(); UseCustomServers = new System.Windows.Forms.CheckBox();
this.lblCustom1 = new System.Windows.Forms.Label(); lblCustom1 = new System.Windows.Forms.Label();
this.lblCustom2 = new System.Windows.Forms.Label(); lblCustom2 = new System.Windows.Forms.Label();
this.CustomDns1 = new System.Windows.Forms.TextBox(); CustomDns1 = new System.Windows.Forms.TextBox();
this.CustomDns2 = new System.Windows.Forms.TextBox(); CustomDns2 = new System.Windows.Forms.TextBox();
this.lslStatus = new System.Windows.Forms.Label(); lslStatus = new System.Windows.Forms.Label();
this.StatusBox = new System.Windows.Forms.ListBox(); StatusBox = new System.Windows.Forms.ListBox();
this.chkDns1 = new System.Windows.Forms.CheckBox(); chkDns1 = new System.Windows.Forms.CheckBox();
this.chkDns2 = new System.Windows.Forms.CheckBox(); chkDns2 = new System.Windows.Forms.CheckBox();
this.label1 = new System.Windows.Forms.Label(); label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label(); label2 = new System.Windows.Forms.Label();
this.txtResolveIP = new System.Windows.Forms.TextBox(); txtResolveIP = new System.Windows.Forms.TextBox();
this.txtResolveHost = new System.Windows.Forms.TextBox(); txtResolveHost = new System.Windows.Forms.TextBox();
this.btnResolveIP = new System.Windows.Forms.Button(); btnResolveIP = new System.Windows.Forms.Button();
this.btnResolveHost = new System.Windows.Forms.Button(); btnResolveHost = new System.Windows.Forms.Button();
this.label3 = new System.Windows.Forms.Label(); label3 = new System.Windows.Forms.Label();
this.numericUpDown1 = new System.Windows.Forms.NumericUpDown(); numericUpDown1 = new System.Windows.Forms.NumericUpDown();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit(); comboBox1 = new System.Windows.Forms.ComboBox();
this.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)numericUpDown1).BeginInit();
SuspendLayout();
// //
// ResultView // ResultView
// //
this.ResultView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { ResultView.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { WebName, DNS1IP, DNS1Timing, DNS2IP, DNS2Timing });
this.WebName, ResultView.GridLines = true;
this.DNS1IP, ResultView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.DNS1Timing, ResultView.Location = new System.Drawing.Point(155, 469);
this.DNS2IP, ResultView.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7);
this.DNS2Timing}); ResultView.MultiSelect = false;
this.ResultView.GridLines = true; ResultView.Name = "ResultView";
this.ResultView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; ResultView.Size = new System.Drawing.Size(2209, 663);
this.ResultView.HideSelection = false; ResultView.TabIndex = 11;
this.ResultView.Location = new System.Drawing.Point(155, 379); ResultView.UseCompatibleStateImageBehavior = false;
this.ResultView.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); ResultView.View = System.Windows.Forms.View.Details;
this.ResultView.MultiSelect = false;
this.ResultView.Name = "ResultView";
this.ResultView.Size = new System.Drawing.Size(2209, 753);
this.ResultView.TabIndex = 11;
this.ResultView.UseCompatibleStateImageBehavior = false;
this.ResultView.View = System.Windows.Forms.View.Details;
// //
// WebName // WebName
// //
this.WebName.Text = "URL"; WebName.Text = "URL";
this.WebName.Width = 160; WebName.Width = 160;
// //
// DNS1IP // DNS1IP
// //
this.DNS1IP.Text = "IP Address from DNS 1"; DNS1IP.Text = "IP Address from DNS 1";
this.DNS1IP.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; DNS1IP.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
this.DNS1IP.Width = 140; DNS1IP.Width = 140;
// //
// DNS1Timing // DNS1Timing
// //
this.DNS1Timing.Text = "DNS 1 Timing"; DNS1Timing.Text = "DNS 1 Timing";
this.DNS1Timing.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; DNS1Timing.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
this.DNS1Timing.Width = 120; DNS1Timing.Width = 120;
// //
// DNS2IP // DNS2IP
// //
this.DNS2IP.Text = "IP Address from DNS 2"; DNS2IP.Text = "IP Address from DNS 2";
this.DNS2IP.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; DNS2IP.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
this.DNS2IP.Width = 140; DNS2IP.Width = 140;
// //
// DNS2Timing // DNS2Timing
// //
this.DNS2Timing.Text = "DNS 2 Timing"; DNS2Timing.Text = "DNS 2 Timing";
this.DNS2Timing.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; DNS2Timing.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
this.DNS2Timing.Width = 120; DNS2Timing.Width = 120;
// //
// RunTest // RunTest
// //
this.RunTest.Location = new System.Drawing.Point(1131, 1152); RunTest.Location = new System.Drawing.Point(1131, 1152);
this.RunTest.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); RunTest.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7);
this.RunTest.Name = "RunTest"; RunTest.Name = "RunTest";
this.RunTest.Size = new System.Drawing.Size(200, 55); RunTest.Size = new System.Drawing.Size(200, 55);
this.RunTest.TabIndex = 12; RunTest.TabIndex = 12;
this.RunTest.Text = "Run Test"; RunTest.Text = "Run Test";
this.RunTest.Click += new System.EventHandler(this.RunTest_Click); RunTest.Click += RunTest_Click;
// //
// lblDns1 // lblDns1
// //
this.lblDns1.AutoSize = true; lblDns1.AutoSize = true;
this.lblDns1.Location = new System.Drawing.Point(155, 167); lblDns1.Location = new System.Drawing.Point(155, 167);
this.lblDns1.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0); lblDns1.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0);
this.lblDns1.Name = "lblDns1"; lblDns1.Name = "lblDns1";
this.lblDns1.Size = new System.Drawing.Size(95, 32); lblDns1.Size = new System.Drawing.Size(100, 41);
this.lblDns1.TabIndex = 13; lblDns1.TabIndex = 13;
this.lblDns1.Text = "Dns 1:"; lblDns1.Text = "Dns 1:";
// //
// lblDns2 // lblDns2
// //
this.lblDns2.AutoSize = true; lblDns2.AutoSize = true;
this.lblDns2.Location = new System.Drawing.Point(1096, 167); lblDns2.Location = new System.Drawing.Point(1174, 173);
this.lblDns2.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0); lblDns2.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0);
this.lblDns2.Name = "lblDns2"; lblDns2.Name = "lblDns2";
this.lblDns2.Size = new System.Drawing.Size(95, 32); lblDns2.Size = new System.Drawing.Size(100, 41);
this.lblDns2.TabIndex = 14; lblDns2.TabIndex = 14;
this.lblDns2.Text = "Dns 2:"; lblDns2.Text = "Dns 2:";
// //
// dnsList1 // dnsList1
// //
this.dnsList1.FormattingEnabled = true; dnsList1.FormattingEnabled = true;
this.dnsList1.ItemHeight = 31; dnsList1.ItemHeight = 41;
this.dnsList1.Location = new System.Drawing.Point(277, 155); dnsList1.Location = new System.Drawing.Point(277, 155);
this.dnsList1.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); dnsList1.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7);
this.dnsList1.Name = "dnsList1"; dnsList1.Name = "dnsList1";
this.dnsList1.Size = new System.Drawing.Size(756, 39); dnsList1.Size = new System.Drawing.Size(756, 49);
this.dnsList1.TabIndex = 15; dnsList1.TabIndex = 15;
// //
// dnsList2 // dnsList2
// //
this.dnsList2.FormattingEnabled = true; dnsList2.FormattingEnabled = true;
this.dnsList2.ItemHeight = 31; dnsList2.ItemHeight = 41;
this.dnsList2.Location = new System.Drawing.Point(1229, 155); dnsList2.Location = new System.Drawing.Point(1307, 161);
this.dnsList2.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); dnsList2.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7);
this.dnsList2.Name = "dnsList2"; dnsList2.Name = "dnsList2";
this.dnsList2.Size = new System.Drawing.Size(788, 39); dnsList2.Size = new System.Drawing.Size(788, 49);
this.dnsList2.TabIndex = 16; dnsList2.TabIndex = 16;
// //
// UseCustomServers // UseCustomServers
// //
this.UseCustomServers.AutoSize = true; UseCustomServers.AutoSize = true;
this.UseCustomServers.Location = new System.Drawing.Point(2091, 167); UseCustomServers.Location = new System.Drawing.Point(2169, 173);
this.UseCustomServers.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); UseCustomServers.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7);
this.UseCustomServers.Name = "UseCustomServers"; UseCustomServers.Name = "UseCustomServers";
this.UseCustomServers.Size = new System.Drawing.Size(253, 36); UseCustomServers.Size = new System.Drawing.Size(262, 45);
this.UseCustomServers.TabIndex = 17; UseCustomServers.TabIndex = 17;
this.UseCustomServers.Text = "Custom Servers"; UseCustomServers.Text = "Custom Servers";
this.UseCustomServers.UseVisualStyleBackColor = true; UseCustomServers.UseVisualStyleBackColor = true;
this.UseCustomServers.CheckedChanged += new System.EventHandler(this.UseCustomServers_CheckedChanged); UseCustomServers.CheckedChanged += UseCustomServers_CheckedChanged;
// //
// lblCustom1 // lblCustom1
// //
this.lblCustom1.AutoSize = true; lblCustom1.AutoSize = true;
this.lblCustom1.Location = new System.Drawing.Point(155, 293); lblCustom1.Location = new System.Drawing.Point(155, 328);
this.lblCustom1.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0); lblCustom1.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0);
this.lblCustom1.Name = "lblCustom1"; lblCustom1.Name = "lblCustom1";
this.lblCustom1.Size = new System.Drawing.Size(206, 32); lblCustom1.Size = new System.Drawing.Size(219, 41);
this.lblCustom1.TabIndex = 18; lblCustom1.TabIndex = 18;
this.lblCustom1.Text = "Custom Dns 1: "; lblCustom1.Text = "Custom Dns 1: ";
this.lblCustom1.Visible = false; lblCustom1.Visible = false;
// //
// lblCustom2 // lblCustom2
// //
this.lblCustom2.AutoSize = true; lblCustom2.AutoSize = true;
this.lblCustom2.Location = new System.Drawing.Point(1096, 293); lblCustom2.Location = new System.Drawing.Point(1174, 334);
this.lblCustom2.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0); lblCustom2.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0);
this.lblCustom2.Name = "lblCustom2"; lblCustom2.Name = "lblCustom2";
this.lblCustom2.Size = new System.Drawing.Size(206, 32); lblCustom2.Size = new System.Drawing.Size(219, 41);
this.lblCustom2.TabIndex = 19; lblCustom2.TabIndex = 19;
this.lblCustom2.Text = "Custom Dns 2: "; lblCustom2.Text = "Custom Dns 2: ";
this.lblCustom2.Visible = false; lblCustom2.Visible = false;
// //
// CustomDns1 // CustomDns1
// //
this.CustomDns1.BackColor = System.Drawing.Color.White; CustomDns1.BackColor = System.Drawing.Color.White;
this.CustomDns1.Enabled = false; CustomDns1.Enabled = false;
this.CustomDns1.Location = new System.Drawing.Point(408, 289); CustomDns1.Location = new System.Drawing.Point(408, 324);
this.CustomDns1.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); CustomDns1.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7);
this.CustomDns1.Name = "CustomDns1"; CustomDns1.Name = "CustomDns1";
this.CustomDns1.Size = new System.Drawing.Size(625, 38); CustomDns1.Size = new System.Drawing.Size(625, 47);
this.CustomDns1.TabIndex = 20; CustomDns1.TabIndex = 20;
this.CustomDns1.Visible = false; CustomDns1.Visible = false;
// //
// CustomDns2 // CustomDns2
// //
this.CustomDns2.Enabled = false; CustomDns2.Enabled = false;
this.CustomDns2.Location = new System.Drawing.Point(1349, 289); CustomDns2.Location = new System.Drawing.Point(1427, 330);
this.CustomDns2.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); CustomDns2.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7);
this.CustomDns2.Name = "CustomDns2"; CustomDns2.Name = "CustomDns2";
this.CustomDns2.Size = new System.Drawing.Size(668, 38); CustomDns2.Size = new System.Drawing.Size(668, 47);
this.CustomDns2.TabIndex = 21; CustomDns2.TabIndex = 21;
this.CustomDns2.Visible = false; CustomDns2.Visible = false;
// //
// lslStatus // lslStatus
// //
this.lslStatus.AutoSize = true; lslStatus.AutoSize = true;
this.lslStatus.Location = new System.Drawing.Point(155, 1219); lslStatus.Location = new System.Drawing.Point(155, 1219);
this.lslStatus.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0); lslStatus.Margin = new System.Windows.Forms.Padding(8, 0, 8, 0);
this.lslStatus.Name = "lslStatus"; lslStatus.Name = "lslStatus";
this.lslStatus.Size = new System.Drawing.Size(103, 32); lslStatus.Size = new System.Drawing.Size(105, 41);
this.lslStatus.TabIndex = 22; lslStatus.TabIndex = 22;
this.lslStatus.Text = "Status:"; lslStatus.Text = "Status:";
// //
// StatusBox // StatusBox
// //
this.StatusBox.FormattingEnabled = true; StatusBox.FormattingEnabled = true;
this.StatusBox.HorizontalScrollbar = true; StatusBox.HorizontalScrollbar = true;
this.StatusBox.ItemHeight = 31; StatusBox.ItemHeight = 41;
this.StatusBox.Location = new System.Drawing.Point(155, 1271); StatusBox.Location = new System.Drawing.Point(155, 1271);
this.StatusBox.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); StatusBox.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7);
this.StatusBox.Name = "StatusBox"; StatusBox.Name = "StatusBox";
this.StatusBox.Size = new System.Drawing.Size(2209, 376); StatusBox.Size = new System.Drawing.Size(2209, 373);
this.StatusBox.TabIndex = 23; StatusBox.TabIndex = 23;
// //
// chkDns1 // chkDns1
// //
this.chkDns1.AutoSize = true; chkDns1.AutoSize = true;
this.chkDns1.Checked = true; chkDns1.Checked = true;
this.chkDns1.CheckState = System.Windows.Forms.CheckState.Checked; chkDns1.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkDns1.Location = new System.Drawing.Point(277, 220); chkDns1.Location = new System.Drawing.Point(277, 235);
this.chkDns1.Name = "chkDns1"; chkDns1.Name = "chkDns1";
this.chkDns1.Size = new System.Drawing.Size(245, 36); chkDns1.Size = new System.Drawing.Size(251, 45);
this.chkDns1.TabIndex = 24; chkDns1.TabIndex = 24;
this.chkDns1.Text = "Test dns server"; chkDns1.Text = "Test dns server";
this.chkDns1.UseVisualStyleBackColor = true; chkDns1.UseVisualStyleBackColor = true;
// //
// chkDns2 // chkDns2
// //
this.chkDns2.AutoSize = true; chkDns2.AutoSize = true;
this.chkDns2.Checked = true; chkDns2.Checked = true;
this.chkDns2.CheckState = System.Windows.Forms.CheckState.Checked; chkDns2.CheckState = System.Windows.Forms.CheckState.Checked;
this.chkDns2.Location = new System.Drawing.Point(1229, 220); chkDns2.Location = new System.Drawing.Point(1307, 241);
this.chkDns2.Name = "chkDns2"; chkDns2.Name = "chkDns2";
this.chkDns2.Size = new System.Drawing.Size(245, 36); chkDns2.Size = new System.Drawing.Size(251, 45);
this.chkDns2.TabIndex = 25; chkDns2.TabIndex = 25;
this.chkDns2.Text = "Test dns server"; chkDns2.Text = "Test dns server";
this.chkDns2.UseVisualStyleBackColor = true; chkDns2.UseVisualStyleBackColor = true;
// //
// label1 // label1
// //
this.label1.AutoSize = true; label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(155, 27); label1.Location = new System.Drawing.Point(155, 27);
this.label1.Name = "label1"; label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(263, 32); label1.Size = new System.Drawing.Size(270, 41);
this.label1.TabIndex = 26; label1.TabIndex = 26;
this.label1.Text = "Resolve ip address:"; label1.Text = "Resolve ip address:";
// //
// label2 // label2
// //
this.label2.AutoSize = true; label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(1102, 27); label2.Location = new System.Drawing.Point(1180, 33);
this.label2.Name = "label2"; label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(257, 32); label2.Size = new System.Drawing.Size(266, 41);
this.label2.TabIndex = 27; label2.TabIndex = 27;
this.label2.Text = "Resolve hostname:"; label2.Text = "Resolve hostname:";
// //
// txtResolveIP // txtResolveIP
// //
this.txtResolveIP.Location = new System.Drawing.Point(425, 21); txtResolveIP.Location = new System.Drawing.Point(425, 21);
this.txtResolveIP.Name = "txtResolveIP"; txtResolveIP.Name = "txtResolveIP";
this.txtResolveIP.Size = new System.Drawing.Size(608, 38); txtResolveIP.Size = new System.Drawing.Size(608, 47);
this.txtResolveIP.TabIndex = 28; txtResolveIP.TabIndex = 28;
// //
// txtResolveHost // txtResolveHost
// //
this.txtResolveHost.Location = new System.Drawing.Point(1365, 21); txtResolveHost.Location = new System.Drawing.Point(1443, 27);
this.txtResolveHost.Name = "txtResolveHost"; txtResolveHost.Name = "txtResolveHost";
this.txtResolveHost.Size = new System.Drawing.Size(651, 38); txtResolveHost.Size = new System.Drawing.Size(651, 47);
this.txtResolveHost.TabIndex = 29; txtResolveHost.TabIndex = 29;
// //
// btnResolveIP // btnResolveIP
// //
this.btnResolveIP.Location = new System.Drawing.Point(425, 75); btnResolveIP.Location = new System.Drawing.Point(425, 75);
this.btnResolveIP.Name = "btnResolveIP"; btnResolveIP.Name = "btnResolveIP";
this.btnResolveIP.Size = new System.Drawing.Size(195, 70); btnResolveIP.Size = new System.Drawing.Size(205, 51);
this.btnResolveIP.TabIndex = 30; btnResolveIP.TabIndex = 30;
this.btnResolveIP.Text = "Resolve"; btnResolveIP.Text = "Resolve";
this.btnResolveIP.UseVisualStyleBackColor = true; btnResolveIP.UseVisualStyleBackColor = true;
this.btnResolveIP.Click += new System.EventHandler(this.btnResolveIP_Click); btnResolveIP.Click += btnResolveIP_Click;
// //
// btnResolveHost // btnResolveHost
// //
this.btnResolveHost.Location = new System.Drawing.Point(1366, 75); btnResolveHost.Location = new System.Drawing.Point(1443, 81);
this.btnResolveHost.Name = "btnResolveHost"; btnResolveHost.Name = "btnResolveHost";
this.btnResolveHost.Size = new System.Drawing.Size(221, 70); btnResolveHost.Size = new System.Drawing.Size(167, 45);
this.btnResolveHost.TabIndex = 31; btnResolveHost.TabIndex = 31;
this.btnResolveHost.Text = "Resolve"; btnResolveHost.Text = "Resolve";
this.btnResolveHost.UseVisualStyleBackColor = true; btnResolveHost.UseVisualStyleBackColor = true;
this.btnResolveHost.Click += new System.EventHandler(this.btnResolveHost_Click); btnResolveHost.Click += btnResolveHost_Click;
// //
// label3 // label3
// //
this.label3.AutoSize = true; label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(675, 223); label3.Location = new System.Drawing.Point(675, 238);
this.label3.Name = "label3"; label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(201, 32); label3.Size = new System.Drawing.Size(210, 41);
this.label3.TabIndex = 32; label3.TabIndex = 32;
this.label3.Text = "Total domains:"; label3.Text = "Total domains:";
// //
// numericUpDown1 // numericUpDown1
// //
this.numericUpDown1.Location = new System.Drawing.Point(913, 223); numericUpDown1.Location = new System.Drawing.Point(913, 238);
this.numericUpDown1.Maximum = new decimal(new int[] { numericUpDown1.Maximum = new decimal(new int[] { 1000000000, 0, 0, 0 });
1000000000, numericUpDown1.Minimum = new decimal(new int[] { 1, 0, 0, 0 });
0, numericUpDown1.Name = "numericUpDown1";
0, numericUpDown1.Size = new System.Drawing.Size(120, 47);
0}); numericUpDown1.TabIndex = 33;
this.numericUpDown1.Minimum = new decimal(new int[] { numericUpDown1.Value = new decimal(new int[] { 20, 0, 0, 0 });
1, //
0, // comboBox1
0, //
0}); comboBox1.FormattingEnabled = true;
this.numericUpDown1.Name = "numericUpDown1"; comboBox1.Items.AddRange(new object[] { "A", "NS", "CNAME", "MX", "TXT" });
this.numericUpDown1.Size = new System.Drawing.Size(120, 38); comboBox1.Location = new System.Drawing.Point(2129, 251);
this.numericUpDown1.TabIndex = 33; comboBox1.Name = "comboBox1";
this.numericUpDown1.Value = new decimal(new int[] { comboBox1.Size = new System.Drawing.Size(302, 49);
20, comboBox1.TabIndex = 34;
0, comboBox1.SelectedIndexChanged += comboBox1_SelectedIndexChanged;
0,
0});
// //
// MainForm // MainForm
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(240F, 240F); AutoScaleDimensions = new System.Drawing.SizeF(240F, 240F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
this.AutoSize = true; AutoSize = true;
this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.ClientSize = new System.Drawing.Size(2517, 1693); ClientSize = new System.Drawing.Size(2517, 1693);
this.Controls.Add(this.numericUpDown1); Controls.Add(comboBox1);
this.Controls.Add(this.label3); Controls.Add(numericUpDown1);
this.Controls.Add(this.btnResolveHost); Controls.Add(label3);
this.Controls.Add(this.btnResolveIP); Controls.Add(btnResolveHost);
this.Controls.Add(this.txtResolveHost); Controls.Add(btnResolveIP);
this.Controls.Add(this.txtResolveIP); Controls.Add(txtResolveHost);
this.Controls.Add(this.label2); Controls.Add(txtResolveIP);
this.Controls.Add(this.label1); Controls.Add(label2);
this.Controls.Add(this.chkDns2); Controls.Add(label1);
this.Controls.Add(this.chkDns1); Controls.Add(chkDns2);
this.Controls.Add(this.StatusBox); Controls.Add(chkDns1);
this.Controls.Add(this.lslStatus); Controls.Add(StatusBox);
this.Controls.Add(this.CustomDns2); Controls.Add(lslStatus);
this.Controls.Add(this.CustomDns1); Controls.Add(CustomDns2);
this.Controls.Add(this.lblCustom2); Controls.Add(CustomDns1);
this.Controls.Add(this.lblCustom1); Controls.Add(lblCustom2);
this.Controls.Add(this.UseCustomServers); Controls.Add(lblCustom1);
this.Controls.Add(this.dnsList2); Controls.Add(UseCustomServers);
this.Controls.Add(this.dnsList1); Controls.Add(dnsList2);
this.Controls.Add(this.lblDns2); Controls.Add(dnsList1);
this.Controls.Add(this.lblDns1); Controls.Add(lblDns2);
this.Controls.Add(this.RunTest); Controls.Add(lblDns1);
this.Controls.Add(this.ResultView); Controls.Add(RunTest);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); Controls.Add(ResultView);
this.Margin = new System.Windows.Forms.Padding(8, 7, 8, 7); Icon = (System.Drawing.Icon)resources.GetObject("$this.Icon");
this.MaximizeBox = false; Margin = new System.Windows.Forms.Padding(8, 7, 8, 7);
this.Name = "MainForm"; MaximizeBox = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; Name = "MainForm";
this.Text = "EonaCat.DnsTester"; StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Load += new System.EventHandler(this.TesterUI_Load); Text = "EonaCat.DnsTester";
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit(); Load += TesterUI_Load;
this.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)numericUpDown1).EndInit();
this.PerformLayout(); ResumeLayout(false);
PerformLayout();
} }
#endregion #endregion
@ -415,6 +408,7 @@
private System.Windows.Forms.Button btnResolveHost; private System.Windows.Forms.Button btnResolveHost;
private System.Windows.Forms.Label label3; private System.Windows.Forms.Label label3;
private System.Windows.Forms.NumericUpDown numericUpDown1; private System.Windows.Forms.NumericUpDown numericUpDown1;
private System.Windows.Forms.ComboBox comboBox1;
} }
} }

View File

@ -1,6 +1,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
using System.DirectoryServices.ActiveDirectory;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
@ -19,6 +20,7 @@ namespace EonaCat.DnsTester
{ {
private bool useCustomDnsServers; private bool useCustomDnsServers;
private string _dnsServer1, _dnsServer2; private string _dnsServer1, _dnsServer2;
private DnsRecordType _recordType;
private int _dnsTotalChecked; private int _dnsTotalChecked;
public bool IsRunning { get; private set; } public bool IsRunning { get; private set; }
@ -28,10 +30,17 @@ namespace EonaCat.DnsTester
InitializeComponent(); InitializeComponent();
} }
private void RunTest_Click(object sender, EventArgs e) private async void RunTest_Click(object sender, EventArgs e)
{ {
List<string> urls = new List<string>(); List<string> urls = new List<string>();
SetupUrls(urls); SetupView();
await Task.Run(() =>
{
UrlHelper.GetRandomUrls(ref urls, (int)numericUpDown1.Value);
});
AddUrlToView(urls);
if (IsRunning) if (IsRunning)
{ {
@ -39,11 +48,11 @@ namespace EonaCat.DnsTester
} }
IsRunning = true; IsRunning = true;
Process(urls.ToArray(), _dnsServer1, _dnsServer2); Process(_recordType, urls.ToArray(), _dnsServer1, _dnsServer2);
IsRunning = false; IsRunning = false;
} }
private void SetupUrls(List<string> urls) private void SetupView()
{ {
if (useCustomDnsServers) if (useCustomDnsServers)
{ {
@ -81,9 +90,8 @@ namespace EonaCat.DnsTester
ResultView.Update(); ResultView.Update();
Application.DoEvents(); Application.DoEvents();
UrlHelper.Log -= UrlHelper_Log;
UrlHelper.Log += UrlHelper_Log; UrlHelper.Log += UrlHelper_Log;
UrlHelper.GetRandomUrls(ref urls, (int)numericUpDown1.Value);
AddUrlToView(urls);
} }
private void UrlHelper_Log(object sender, string e) private void UrlHelper_Log(object sender, string e)
@ -178,89 +186,132 @@ namespace EonaCat.DnsTester
} }
private void Process(string[] urls, string dnsAddress1, string dnsAddress2) private async Task Process(DnsRecordType recordType, string[] urls, string dnsAddress1, string dnsAddress2)
{ {
int i; if (recordType == 0)
int urlsTotal = urls.Length;
const int ipPort = 53;
const string transactionId1 = "Q1";
const string transactionId2 = "Q2";
const string typeString = "\u0001" + "\u0000" + "\u0000" + "\u0001" + "\u0000" + "\u0000" + "\u0000" + "\u0000" + "\u0000" + "\u0000";
const string trailerString = "\u0000" + "\u0000" + "\u0001" + "\u0000" + "\u0001";
const int dnsReceiveTimeout = 5000;
string startOfUrl = string.Empty;
string domain = string.Empty;
byte[] bytesSend = new byte[256];
Socket dnsSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
dnsSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, dnsReceiveTimeout);
SetupDnsServers(dnsAddress1, dnsAddress2, ipPort, out var dnsEndpoint1, out var dnsEndpoint2);
// Start the clock
var startTime = DateTime.Now.Ticks;
for (i = 0; i < urlsTotal; i++)
{ {
var currentUrl = urls[i]; recordType = DnsRecordType.A;
startOfUrl = currentUrl.Substring(0, currentUrl.IndexOf("."));
domain = currentUrl.Substring(currentUrl.IndexOf(".") + 1,
currentUrl.Length - currentUrl.IndexOf(".") - 1);
var dnsQuery = typeString + (char)startOfUrl.Length + startOfUrl + (char)domain.Length + domain +
trailerString;
string queryString;
if (chkDns1.Checked)
{
queryString = transactionId1 + dnsQuery;
bytesSend = Encoding.ASCII.GetBytes(queryString);
if (dnsEndpoint1 != null)
dnsSocket.SendTo(bytesSend, bytesSend.Length, SocketFlags.None, dnsEndpoint1);
}
if (!chkDns2.Checked) continue;
queryString = transactionId2 + dnsQuery;
bytesSend = Encoding.ASCII.GetBytes(queryString);
if (dnsEndpoint2 != null) dnsSocket.SendTo(bytesSend, bytesSend.Length, SocketFlags.None, dnsEndpoint2);
} }
int urlsTotal = urls.Length;
const string dnsId1 = "Dns1";
const string dnsId2 = "Dns2";
DnsHelper.OnLog -= DnsHelper_OnLog;
DnsHelper.OnLog += DnsHelper_OnLog;
for (int i = 0; i < urlsTotal; i++)
{
var currentUrl = urls[i];
await ExecuteDns1(recordType, dnsAddress1, currentUrl, dnsId1, i);
if (!chkDns2.Checked) continue;
await ExecuteDns2(recordType, dnsAddress2, currentUrl, dnsId2, i);
await Task.Delay(100);
}
}
private async Task ExecuteDns2(DnsRecordType recordType, string dnsAddress2, string currentUrl, string dnsId2,
int i)
{
try try
{ {
DnsHelper.Log += DnsHelper_Log; DnsResponse response2 = null;
DnsHelper.ProcessDns(startOfUrl, domain, urlsTotal, dnsSocket, bytesSend, startTime, _dnsTotalChecked, ResultView); byte[] queryBytes2 = DnsHelper.CreateDnsQueryPacket(currentUrl, recordType);
response2 = await DnsHelper.SendDnsQueryPacket(dnsId2, dnsAddress2, 53, queryBytes2);
ProcessResponse(response2);
} }
catch (SocketException socketException) catch (SocketException socketException)
{ {
SetStatus( SetStatus(
Convert.ToString(socketException).IndexOf("time", StringComparison.Ordinal) > 0 Convert.ToString(socketException).IndexOf("time", StringComparison.Ordinal) > 0
? $"Timeout - No response received for {Convert.ToString(dnsReceiveTimeout / 1000)} seconds" ? $"DNS1 Timeout - No response received for {Convert.ToString(DnsHelper.DnsReceiveTimeout / 1000)} seconds"
: Convert.ToString(socketException)); : Convert.ToString(socketException));
} }
finally catch (Exception exception)
{ {
// close the socket SetStatus(exception.Message);
dnsSocket.Close(); i--;
} }
} }
private void DnsHelper_Log(object sender, string e) private async Task ExecuteDns1(DnsRecordType recordType, string dnsAddress1, string currentUrl, string dnsId1,
int i)
{
if (chkDns1.Checked)
{
try
{
DnsResponse response1 = null;
byte[] queryBytes1 = DnsHelper.CreateDnsQueryPacket(currentUrl, recordType);
response1 = await DnsHelper.SendDnsQueryPacket(dnsId1, dnsAddress1, 53, queryBytes1);
ProcessResponse(response1);
}
catch (SocketException socketException)
{
SetStatus(
Convert.ToString(socketException).IndexOf("time", StringComparison.Ordinal) > 0
? $"DNS1 Timeout - No response received for {Convert.ToString(DnsHelper.DnsReceiveTimeout / 1000)} seconds"
: Convert.ToString(socketException));
}
catch (Exception exception)
{
SetStatus(exception.Message);
i--;
}
}
}
private void DnsHelper_OnLog(object sender, string e)
{ {
SetStatus(e); SetStatus(e);
} }
private void SetupDnsServers(string dnsAddress1, string dnsAddress2, int ipPort, out IPEndPoint dnsEndpoint1, private void ProcessResponse(DnsResponse dnsResponse)
out IPEndPoint dnsEndpoint2)
{ {
dnsEndpoint1 = null; if (dnsResponse == null || dnsResponse.Answers == null || !dnsResponse.Answers.Any())
if (chkDns1.Checked && !string.IsNullOrWhiteSpace(dnsAddress1))
{ {
dnsEndpoint1 = new IPEndPoint(IPAddress.Parse(dnsAddress1), ipPort); return;
} }
dnsEndpoint2 = null; // Retrieve stopTime
if (chkDns2.Checked && !string.IsNullOrWhiteSpace(dnsAddress2)) var stopTime = DateTime.Now.Ticks;
var deltaTime = Convert.ToString((double)(stopTime - dnsResponse.StartTime) / 10000000);
SetStatus($"ResourceRecord: Name: {dnsResponse.Answers.FirstOrDefault().Name} : Type : {dnsResponse.Answers.FirstOrDefault().Type} : Data : {dnsResponse.Answers.FirstOrDefault().Data}");
for (int i = 0; i < ResultView.Items.Count; i++)
{ {
dnsEndpoint2 = new IPEndPoint(IPAddress.Parse(dnsAddress2), ipPort); if (ResultView.Items[i].Text != $"{dnsResponse.Answers.FirstOrDefault().Name.TrimEnd('.')}") continue;
string sDeltaTime;
switch (dnsResponse.DnsId)
{
case "Dns1":
ResultView.Items[i].SubItems[1].Text = Convert.ToString(dnsResponse.Answers.FirstOrDefault().Data);
sDeltaTime = Convert.ToString(deltaTime);
ResultView.Items[i].SubItems[2].Text =
sDeltaTime.Length > 5 ? sDeltaTime.Substring(0, 5) : sDeltaTime;
ResultView.Items[i].ForeColor = System.Drawing.Color.Red;
ResultView.EnsureVisible(i);
ResultView.Update();
Application.DoEvents();
ResultView.Items[i].ForeColor = System.Drawing.Color.Black;
break;
case "Dns2":
ResultView.Items[i].SubItems[3].Text = Convert.ToString(dnsResponse.Answers.FirstOrDefault().Data);
sDeltaTime = Convert.ToString(deltaTime);
ResultView.Items[i].SubItems[4].Text =
sDeltaTime.Length > 5 ? sDeltaTime.Substring(0, 5) : sDeltaTime;
ResultView.Items[i].ForeColor = System.Drawing.Color.Red;
ResultView.EnsureVisible(i);
ResultView.Update();
Application.DoEvents();
ResultView.Items[i].ForeColor = System.Drawing.Color.Black;
break;
}
} }
} }
@ -323,15 +374,27 @@ namespace EonaCat.DnsTester
private void SetStatus(string text) private void SetStatus(string text)
{ {
StatusBox.Items.Add($"{DateTime.Now} {text}"); StatusBox.Invoke(() =>
StatusBox.TopIndex = StatusBox.Items.Count - 1;
if (StatusBox.Items.Count > STATUS_BAR_SIZE)
{ {
StatusBox.Items.RemoveAt(0); StatusBox.Items.Add($"{DateTime.Now} {text}");
} StatusBox.TopIndex = StatusBox.Items.Count - 1;
StatusBox.Update(); if (StatusBox.Items.Count > STATUS_BAR_SIZE)
{
StatusBox.Items.RemoveAt(0);
}
StatusBox.Update();
});
} }
const int STATUS_BAR_SIZE = 5000; const int STATUS_BAR_SIZE = 5000;
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (Enum.TryParse(comboBox1.SelectedItem.ToString().ToUpper(), out DnsRecordType queryType))
{
_recordType = queryType;
}
}
} }
} }

View File

@ -1,64 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <root>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">

View File

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")] [assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("EonaCat.EonaCat.DnsTester")] [assembly: AssemblyProduct("EonaCat.EonaCat.DnsTester")]
[assembly: AssemblyCopyright("Copyright © EonaCat (Jeroen Saey) 2027")] [assembly: AssemblyCopyright("Copyright © EonaCat (Jeroen Saey) 2023")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]

View File

@ -8,11 +8,11 @@
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace EonaCat.EonaCat.DnsTester.Properties { namespace EonaCat.DnsTester.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
@ -22,5 +22,17 @@ namespace EonaCat.EonaCat.DnsTester.Properties {
return defaultInstance; return defaultInstance;
} }
} }
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string EonaCat {
get {
return ((string)(this["EonaCat"]));
}
set {
this["EonaCat"] = value;
}
}
} }
} }

View File

@ -1,7 +1,9 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)"> <SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="EonaCat.DnsTester.Properties" GeneratedClassName="Settings">
<Profiles> <Profiles />
<Profile Name="(Default)" /> <Settings>
</Profiles> <Setting Name="EonaCat" Type="System.String" Scope="User">
<Settings /> <Value Profile="(Default)" />
</SettingsFile> </Setting>
</Settings>
</SettingsFile>

View File

@ -1,25 +1,26 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<Servers> <Servers>
<!-- My Local Blocky Dns --> <!-- My Local Blocky Dns -->
<server name="Local Blocky" ip="127.0.0.1"></server> <server name="Local Blocky" ip="127.0.0.1"></server>
<!-- My External Blocky Dns --> <!-- My External Blocky Dns -->
<server name="External Blocky" ip="192.168.1.10"></server> <server name="External Blocky" ip="192.168.1.10"></server>
<!-- My Remote Blocky Dns --> <!-- My Remote Blocky Dns -->
<server name="Remote Blocky" ip="192.168.1.254"></server> <server name="Remote Blocky" ip="192.168.1.254"></server>
<!--Google Dns Servers--> <!--AdGuard DNS-->
<server name="Google (8.8.8.8)" ip="8.8.8.8"></server> <server name="AdGuard Dns (94.140.14.15)" ip="94.140.14.15"></server>
<server name="Google (8.8.4.4)" ip="8.8.8.8"></server> <server name="AdGuard Dns (94.140.15.15)" ip="94.140.15.15"></server>
<!--CloudFlare Dns servers-->
<server name="CloudFlare Standard (1.1.1.1)" ip="1.1.1.1"></server>
<server name="CloudFlare Standard (1.0.0.1)" ip="1.0.0.1"></server>
<!--Quad9 DNS-->
<server name="Quad9 DNS 1 (9.9.9.9)" ip="9.9.9.9"></server>
<server name="Quad9 DNS 2 (149.112.112.9)" ip="149.112.112.9"></server>
<!--Verisign-->
<server name="Verisign (64.6.64.6)" ip="64.6.64.6"></server>
<server name="Verisign (64.6.65.6)" ip="64.6.65.6"></server>
<!--AdGuard DNS-->
<server name="AdGuard DNS (94.140.14.15)" ip="94.140.14.15"></server>
<server name="AdGuard DNS (94.140.15.15)" ip="94.140.15.15"></server>
<!--Verisign-->
<server name="Verisign (64.6.64.6)" ip="64.6.64.6"></server>
<server name="Verisign (64.6.65.6)" ip="64.6.65.6"></server>
<!--Google Dns Servers-->
<server name="Google (8.8.8.8)" ip="8.8.8.8"></server>
<server name="Google (8.8.4.4)" ip="8.8.8.8"></server>
<!--CloudFlare Dns servers-->
<server name="CloudFlare Standard (1.1.1.1)" ip="1.1.1.1"></server>
<server name="CloudFlare Standard (1.0.0.1)" ip="1.0.0.1"></server>
<!--Quad9 DNS-->
<server name="Quad9 Dns 1 (9.9.9.9)" ip="9.9.9.9"></server>
<server name="Quad9 Dns 2 (149.112.112.9)" ip="149.112.112.9"></server>
</Servers> </Servers>