The code below is used to test if a specific server and port is reachable. This code uses a socket to connect to the server and doesn't wait for a response so it is quicker than using a full WebClient request, etc. This code will return true if the server was reachable and false if it was not (within the provided timeout).
public class NetworkReachability { public static bool IsReachable(string url, int timeout) { return IsReachable(new Uri(url), timeout); } public static bool IsReachable(Uri uri, int timeout) { return IsReachable(uri.Host, uri.Port, timeout); } public static bool IsReachable(string host, int port, int timeout) { if (AppConfig.IsDebugCompile) { Thread.Sleep(250); return true; } try { using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { var handler = new ManualResetEvent(false); var e = new SocketAsyncEventArgs(); e.RemoteEndPoint = new DnsEndPoint(host, port); e.Completed += delegate { handler.Set(); }; if (!socket.ConnectAsync(e)) handler.Set(); return handler.WaitOne(timeout) && e.ConnectByNameError == null && socket.Connected; } } catch { return false; } } }
No comments:
Post a Comment