/** @author Jaimon Mathew csc /target:library /out:DnsLib.dll /D:DEBUG=1 /debug+ DnsLite.cs */ using System; using System.Net; using System.IO; using System.Text; using System.Net.Sockets; using System.Collections; namespace DnsLib { public class MXRecord { public int preference = -1; public string exchange = null; public override string ToString() { return "Preference : " + preference + " Exchange : " + exchange; } } public class DnsLite { private byte[] data; private int position, id, length; private string name; private ArrayList dnsServers; private static int DNS_PORT = 53; Encoding ASCII = Encoding.ASCII; public DnsLite() { id = DateTime.Now.Millisecond * 60; dnsServers = new ArrayList(); } public void setDnsServers(ArrayList dnsServers) { this.dnsServers = dnsServers; } public ArrayList getMXRecords(string host) { ArrayList mxRecords = null; for(int i=0; i < dnsServers.Count; i++) { try { mxRecords = getMXRecords(host,(string)dnsServers[i]); break; }catch(IOException) { continue; } } return mxRecords; } private int getNewId() { //return a new id return ++id; } public ArrayList getMXRecords(string host,string serverAddress) { //opening the UDP socket at DNS server //use UDPClient, if you are still with Beta1 UdpClient dnsClient = new UdpClient(serverAddress, DNS_PORT); //preparing the DNS query packet. makeQuery(getNewId(),host); //send the data packet dnsClient.Send(data,data.Length); IPEndPoint endpoint = null; //receive the data packet from DNS server data = dnsClient.Receive(ref endpoint); length = data.Length; //un pack the byte array & makes an array of MXRecord objects. return makeResponse(); } //for packing the information to the format accepted by server public void makeQuery(int id,String name) { data = new byte[512]; for(int i = 0; i < 512; ++i) { data[i] = 0; } data[0] = (byte) (id >> 8); data[1] = (byte) (id & 0xFF ); data[2] = (byte) 1; data[3] = (byte) 0; data[4] = (byte) 0; data[5] = (byte) 1; data[6] = (byte) 0; data[7] = (byte) 0; data[8] = (byte) 0; data[9] = (byte) 0; data[10] = (byte) 0; data[11] = (byte) 0; string[] tokens = name.Split(new char[] {'.'}); string label; position = 12; for(int j=0; j= length) { return -1; } offset = ((len & 0x3F) << 8) | (data[position++] & 0xFF); proc(offset); return position; } else { if ((position + len) > length) { return -1; } name += ASCII.GetString(data, position, len); position += len; } if (position > length) { return -1; } len = data[position++] & 0xFF; if (len != 0) { name += "."; } }while (len != 0); return position; } } }