// System.Net.Dns.cs // // Author: Mads Pultz (mpultz@diku.dk) // // (C) Mads Pultz, 2001 using System; using System.Net.Sockets; using System.Text; using System.Collections; using System.Threading; using System.Runtime.CompilerServices; namespace System.Net { public sealed class Dns { /// /// Helper class /// private sealed class DnsAsyncResult: IAsyncResult { private object state; private WaitHandle waitHandle; private bool completedSync, completed; private Worker worker; public DnsAsyncResult(object state) { this.state = state; waitHandle = new ManualResetEvent(false); completedSync = completed = false; } public object AsyncState { get { return state; } } public WaitHandle AsyncWaitHandle { set { waitHandle = value; } get { return waitHandle; } } public bool CompletedSynchronously { get { return completedSync; } } public bool IsCompleted { set { completed = value; } get { return completed; } } public Worker Worker { set { worker = value; } get { return worker; } } } /// /// Helper class for asynchronous calls to DNS server /// private sealed class Worker { private AsyncCallback reqCallback; private DnsAsyncResult reqRes; private string req; private IPHostEntry result; public Worker(string req, AsyncCallback reqCallback, DnsAsyncResult reqRes) { this.req = req; this.reqCallback = reqCallback; this.reqRes = reqRes; } private void End() { reqCallback(reqRes); ((ManualResetEvent)reqRes.AsyncWaitHandle).Set(); reqRes.IsCompleted = true; } public void GetHostByName() { lock(reqRes) { result = Dns.GetHostByName(req); End(); } } public void Resolve() { lock(reqRes) { result = Dns.Resolve(req); End(); } } public IPHostEntry Result { get { return result; } } } public static IAsyncResult BeginGetHostByName(string hostName, AsyncCallback requestCallback, object stateObject) { DnsAsyncResult requestResult = new DnsAsyncResult(stateObject); Worker worker = new Worker(hostName, requestCallback, requestResult); Thread child = new Thread(new ThreadStart(worker.GetHostByName)); child.Start(); return requestResult; } public static IAsyncResult BeginResolve(string hostName, AsyncCallback requestCallback, object stateObject) { DnsAsyncResult requestResult = new DnsAsyncResult(stateObject); Worker worker = new Worker(hostName, requestCallback, requestResult); Thread child = new Thread(new ThreadStart(worker.Resolve)); child.Start(); return requestResult; } public static IPHostEntry EndGetHostByName(IAsyncResult asyncResult) { return ((DnsAsyncResult)asyncResult).Worker.Result; } public static IPHostEntry EndResolve(IAsyncResult asyncResult) { return ((DnsAsyncResult)asyncResult).Worker.Result; } [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern static bool GetHostByName_internal(string host, out string h_name, out string[] h_aliases, out string[] h_addr_list); [MethodImplAttribute(MethodImplOptions.InternalCall)] private extern static bool GetHostByAddr_internal(string addr, out string h_name, out string[] h_aliases, out string[] h_addr_list); private static IPHostEntry hostent_to_IPHostEntry(string h_name, string[] h_aliases, string[] h_addrlist) { IPHostEntry he = new IPHostEntry(); IPAddress[] addrlist = new IPAddress[h_addrlist.Length]; he.HostName=h_name; he.Aliases=h_aliases; for(int i=0; i /// This method returns the host name associated with the local host. /// public static string GetHostName() { IPHostEntry h = GetHostByAddress("127.0.0.1"); return h.HostName; } /// /// This method resovles a DNS-style host name or IP /// address. /// /// /// A string containing either a DNS-style host name (e.g. /// www.go-mono.com) or IP address (e.g. 129.250.184.233). /// public static IPHostEntry Resolve(string hostName) { if (hostName == null) throw new ArgumentNullException(); try { return GetHostByAddress(hostName); } catch (SocketException) { return GetHostByName(hostName); } } } }