PDA

View Full Version : DNS lookup MultiThreaded



m_sardaari
دوشنبه 29 اردیبهشت 1393, 11:11 صبح
با سلام
دوستان کد زیر مربوط به یک پروژه dns lookup میباشد سوالی که دارم اینه که چجوری میتونم این کد رو به چندنخی تغییر بدم یعنی چه متودهای رو به چند نخ واگذار کنم برای اجرا.


using System;


using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Bdev.Net.Dns;
using System.Net;
using System.Diagnostics;
using Bdev.Net.Dns.Records;


namespace SampleApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void Form1_Load(object sender, EventArgs e)
{
foreach (IPAddress ip in DnsProvider.SystemDnsServers())
{
comboBox1.Items.Add(ip.ToString());
}
foreach (IPAddress ip in DnsProvider.DefaultDnsServers)
{
comboBox1.Items.Add(ip.ToString());
}
if (comboBox1.Items.Count > 0)
comboBox1.SelectedIndex = 0;


foreach (DnsClass c in Enum.GetValues(typeof(DnsClass)))
comboBox2.Items.Add(c);
comboBox2.SelectedIndex = 0;


foreach (DnsQType t in Enum.GetValues(typeof(DnsQType)))
comboBox3.Items.Add(t);
comboBox3.SelectedIndex = comboBox3.Items.Count - 1;
}


private void button1_Click(object sender, EventArgs e)
{
string query = textBox1.Text;
IPAddress tIp;


textBox2.Clear();
//richTextBox1.AppendText("Looking up " + textBox1.Text + "\r\n");


try
{
// build request
Request req = new Request();
DnsClass qclass = (DnsClass)comboBox2.SelectedItem;
DnsQType qtype = (DnsQType)comboBox3.SelectedItem;
IPAddress dnsServer;
if (IPAddress.TryParse((string)comboBox1.Text, out dnsServer) == false)
{
MessageBox.Show("Invalid DNS Server Address", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}


if (qtype == DnsQType.PTR && checkBox1.Checked && IPAddress.TryParse(query, out tIp) == true)
query = DnsProvider.IpToArpa(tIp);


Question q = new Question(query, qtype, qclass);
req.AddQuestion(q);


// send request to the dns server
Stopwatch clock = new Stopwatch();
clock.Start();
Response r = Resolver.Lookup(req, dnsServer);
clock.Stop();


textBox2.AppendText(string.Format("; <<>> Bdev.Net.Dns {0} <<>> @{1} {2} {3}\r\n",
DnsProvider.Version,
dnsServer.ToString(),
qtype.ToString(),
query));
textBox2.AppendText(";; global options: none\r\n");


// check for a response
if (r == null)
{
textBox2.AppendText("No answer\r\n");
return;
}


textBox2.AppendText(";; Got answer:\r\n");
textBox2.AppendText(string.Format(";; ->>HEADER<<- opcode: {0}, status: {1}, id: {2}\r\n",
req.Opcode.ToString(),
r.ReturnCode.ToString(),
r.ID.ToString()));


textBox2.AppendText(string.Format(";; flags:{0}{1}{2}{3}; QUERY {4}, ANSWER: {5}, AUTHORITY: {6}, ADDITIONAL: {7}\r\n\r\n",
!r.QR ? " qr" : "", // query/response
r.AuthoritativeAnswer ? " aa" : "", // authoritative answer
req.RecursionDesired ? " rd" : "", // recursion desired
r.RecursionAvailable ? " ra" : "", // recursion available
r.Questions.Length,
r.Answers.Length,
r.NameServers.Length,
r.AdditionalRecords.Length));


if (r.Questions.Length > 0)
{
textBox2.AppendText(";; QUESTION SECTION:\r\n");
foreach (Question rq in r.Questions)
{
textBox2.AppendText(String.Format(";{0}\t\t\t{1}\t{2}\r\n",
rq.Domain,
rq.Class.ToString(),
rq.QType.ToString())
);
}
textBox2.AppendText("\r\n");
}


if (r.Answers.Length > 0)
{
textBox2.AppendText(";; ANSWER SECTION:\r\n");
foreach (Answer ra in r.Answers)
{
textBox2.AppendText(String.Format("{0,-32}{1}\t{2}\t{3}\t{4}\r\n",
ra.Domain,
ra.Ttl.ToString(),
ra.Class.ToString(),
ra.Type.ToString(),
ra.Record.ToString())
);
}
textBox2.AppendText("\r\n");
}


if (r.NameServers.Length > 0)
{
textBox2.AppendText(";; AUTHORITY SECTION:\r\n");
foreach (NameServer rn in r.NameServers)
{
textBox2.AppendText(String.Format("{0,-32}{1}\t{2}\t{3}\t{4}\r\n",
rn.Domain,
rn.Ttl.ToString(),
rn.Class.ToString(),
rn.Type.ToString(),
rn.Record.ToString())
);
}
textBox2.AppendText("\r\n");
}


if (r.AdditionalRecords.Length > 0)
{
textBox2.AppendText(";; ADDITIONAL SECTION:\r\n");
foreach (AdditionalRecord ra in r.AdditionalRecords)
{
textBox2.AppendText(String.Format("{0,-32}{1}\t{2}\t{3}\t{4}\r\n",
ra.Domain,
ra.Ttl.ToString(),
ra.Class.ToString(),
ra.Type.ToString(),
ra.Record.ToString())
);
}
textBox2.AppendText("\r\n");
}


textBox2.AppendText(String.Format(";; Query time: {0} msec\r\n", clock.ElapsedMilliseconds));
textBox2.AppendText(String.Format(";; SERVER: {0}#{1}({2})\r\n", dnsServer.ToString(), 53, dnsServer.ToString()));
textBox2.AppendText(String.Format(";; WHEN: {0}\r\n", DateTime.Now.ToString("ddd MMM dd HH:mm:ss yyyy")));
//TODO: MessageSize is not giving correct info...
textBox2.AppendText(String.Format(";; MSG SIZE rcvd: {0}\r\n", r.MessageSize));
}
catch (Exception ex)
{
textBox2.AppendText("An error ocurred\r\n\r\n" + ex.ToString());
}
}


private void comboBox3_SelectedIndexChanged(object sender, EventArgs e)
{


}


private void checkBox1_CheckedChanged(object sender, EventArgs e)
{


}


private void label5_Click(object sender, EventArgs e)
{


}


private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{


}


private void textBox1_TextChanged(object sender, EventArgs e)
{


}


private void textBox2_TextChanged(object sender, EventArgs e)
{


}


private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{


}
}

}

h_assefi
دوشنبه 29 اردیبهشت 1393, 11:33 صبح
سلام دوست عزیز
تنها پیشنهای که میتونم بهت بدم اینه که تمام کدها و روال های آن را باید بشناسی و توابع یا قطعه کدهایی را با نخ استفاده کن که:
1- باعث سریعتر شدن روند کار میشه
2- پیش نیاز همدیگه نباشند

نکته: وقتی از نخ استفاده میکنی باید دقت بسیاری داشته باشی که موقع اجرای برنامه به مشکل بر نخوری
موفق باشید

m_sardaari
دوشنبه 29 اردیبهشت 1393, 17:29 عصر
ممنون بابت پاسخ
دوست عزیز شاید منظورم رو بد بیان کردم. من نمیخوام کسی پروژه رو برام انجام بده فقط میخوام اگه کسی لطف کنه و ایده بده که چجوری میتونم فرایند پرسش و پاسخ dns رو بصورت چند نخی پیاده سازی کنم. در حد الگوریتم هم باشه کافیه . چون وقتم کمه خواستم ایده رو به استاد اراِئه بدم بعد برای کدنویسی وقت زیاد دارم