RSSなど、外部のXMLリソースへアクセスする際に、存在しないURLにXmlDocument.Loadを直接使うとコネクションタイムアウトまでかなり待たされる。ということで、そのURL(というかサーバー)が存在するかチェックしてからLoadしようということで、
[C#]
public bool HostExist(string url) {
Uri uri = new Uri(url);
if(Uri.CheckHostName(uri.Host) == UriHostNameType.Unknown) {
return false;
}
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
System.Net.IPHostEntry remoteHostEntry = System.Net.Dns.GetHostByName(uri.Host);
System.Net.IPEndPoint ephost = new System.Net.IPEndPoint(remoteHostEntry.AddressList[0], uri.Port);
try {
IAsyncResult ar = sock.BeginConnect(ephost, new AsyncCallback(Async_Connect_Callback), sock);
return ar.AsyncWaitHandle.WaitOne(3000, false);
} catch {
return false;
}
}
public void Async_Connect_Callback(IAsyncResult ar) {
sock.EndConnect(ar);
sock.Close();
}
このサンプルだと、非同期接続で3秒だけ待って接続できなかったら、Falseを返します。
名前解決にSystem.Net.Dns.Resolve()を使うと、存在しないホストの場合、ここでまた待たされてしまうので、GetHostByNameを使ってます。

コメント