3 // Author: Mads Pultz (mpultz@diku.dk)
4 // Author: Lawrence Pit (loz@cable.a2000.nl)
6 // (C) Mads Pultz, 2001
9 using System.Net.Sockets;
11 using System.Collections;
12 using System.Threading;
13 using System.Runtime.CompilerServices;
14 using System.Runtime.Remoting.Messaging;
16 namespace System.Net {
17 public sealed class Dns {
22 System.Net.Sockets.Socket.CheckProtocolSupport();
25 private delegate IPHostEntry GetHostByNameCallback (string hostName);
26 private delegate IPHostEntry ResolveCallback (string hostName);
28 public static IAsyncResult BeginGetHostByName (string hostName,
29 AsyncCallback requestCallback, object stateObject)
32 throw new ArgumentNullException();
34 GetHostByNameCallback c = new GetHostByNameCallback (GetHostByName);
35 return c.BeginInvoke (hostName, requestCallback, stateObject);
38 public static IAsyncResult BeginResolve (string hostName,
39 AsyncCallback requestCallback, object stateObject)
42 throw new ArgumentNullException();
43 ResolveCallback c = new ResolveCallback (Resolve);
44 return c.BeginInvoke (hostName, requestCallback, stateObject);
47 public static IPHostEntry EndGetHostByName (IAsyncResult asyncResult)
\r
49 if (asyncResult == null)
50 throw new ArgumentNullException ("asyncResult");
51 AsyncResult async = (AsyncResult) asyncResult;
52 GetHostByNameCallback cb = (GetHostByNameCallback) async.AsyncDelegate;
53 asyncResult.AsyncWaitHandle.WaitOne ();
54 return cb.EndInvoke(asyncResult);
57 public static IPHostEntry EndResolve (IAsyncResult asyncResult)
\r
59 if (asyncResult == null)
60 throw new ArgumentNullException ("asyncResult");
61 AsyncResult async = (AsyncResult) asyncResult;
62 ResolveCallback cb = (ResolveCallback) async.AsyncDelegate;
63 asyncResult.AsyncWaitHandle.WaitOne ();
64 return cb.EndInvoke(asyncResult);
67 [MethodImplAttribute(MethodImplOptions.InternalCall)]
68 private extern static bool GetHostByName_internal(string host, out string h_name, out string[] h_aliases, out string[] h_addr_list);
70 [MethodImplAttribute(MethodImplOptions.InternalCall)]
71 private extern static bool GetHostByAddr_internal(string addr, out string h_name, out string[] h_aliases, out string[] h_addr_list);
73 [MethodImplAttribute(MethodImplOptions.InternalCall)]
74 private extern static bool GetHostName_internal(out string h_name);
76 private static IPHostEntry hostent_to_IPHostEntry(string h_name, string[] h_aliases, string[] h_addrlist)
\r
78 IPHostEntry he = new IPHostEntry();
79 ArrayList addrlist = new ArrayList();
82 he.Aliases = h_aliases;
83 for(int i=0; i<h_addrlist.Length; i++) {
84 IPAddress newAddress = IPAddress.Parse(h_addrlist[i]);
86 if( (Socket.SupportsIPv6 && newAddress.AddressFamily == AddressFamily.InterNetworkV6) ||
87 (Socket.SupportsIPv4 && newAddress.AddressFamily == AddressFamily.InterNetwork) )
88 addrlist.Add(newAddress);
91 if(addrlist.Count == 0)
92 throw new SocketException(11001);
94 he.AddressList = addrlist.ToArray(typeof(IPAddress)) as IPAddress[];
98 public static IPHostEntry GetHostByAddress(IPAddress address)
\r
101 throw new ArgumentNullException();
102 return GetHostByAddress (address.ToString());
105 public static IPHostEntry GetHostByAddress(string address)
\r
108 throw new ArgumentNullException();
110 // Undocumented MS behavior: when called with IF_ANY,
111 // this should return the local host
112 if (address.Equals ("0.0.0.0"))
113 return GetHostByAddress ("127.0.0.1");
115 /// Must check the IP format, might send an exception if
117 IPAddress.Parse(address);
120 string[] h_aliases, h_addrlist;
122 bool ret = GetHostByAddr_internal(address, out h_name,
126 throw new SocketException(11001);
128 return(hostent_to_IPHostEntry(h_name, h_aliases,
132 public static IPHostEntry GetHostByName(string hostName)
\r
134 if (hostName == null)
135 throw new ArgumentNullException();
138 string[] h_aliases, h_addrlist;
140 bool ret = GetHostByName_internal(hostName, out h_name,
144 throw new SocketException(11001);
146 return(hostent_to_IPHostEntry(h_name, h_aliases,
151 /// This method returns the host name associated with the local host.
153 public static string GetHostName()
\r
157 bool ret = GetHostName_internal(out hostName);
160 throw new SocketException(11001);
166 /// This method resolves a DNS-style host name or IP
169 /// <param name=hostName>
170 /// A string containing either a DNS-style host name (e.g.
171 /// www.go-mono.com) or IP address (e.g. 129.250.184.233).
173 public static IPHostEntry Resolve(string hostName)
\r
175 if (hostName == null)
176 throw new ArgumentNullException();
178 IPHostEntry ret = null;
181 ret = GetHostByAddress(hostName);
\r
186 ret = GetHostByName(hostName);
\r