public void SendAsync(IPAddress ipAddress, PingOptions pingOptions, CancellationToken cancellationToken) { Task.Run(() => { var hostname = pingOptions.Hostname; // Try to resolve PTR if (string.IsNullOrEmpty(hostname)) { try { Task.Run(() => { hostname = Dns.GetHostEntryAsync(ipAddress).Result.HostName; }, cancellationToken); } catch (SocketException) { } } var pingTotal = 0; var errorCount = 0; var options = new System.Net.NetworkInformation.PingOptions { Ttl = pingOptions.TTL, DontFragment = pingOptions.DontFragment }; using (var ping = new System.Net.NetworkInformation.Ping()) { do { try { // Get timestamp var timestamp = DateTime.Now; // Send ping var pingReply = ping.Send(ipAddress, pingOptions.Timeout, pingOptions.Buffer, options); // Reset the error count (if no exception was thrown) errorCount = 0; if (pingReply == null || pingReply.Status != IPStatus.Success) { if (pingReply != null && pingReply.Address == null) { OnPingReceived(new PingReceivedArgs(timestamp, ipAddress, hostname, pingReply.Status)); } else if (pingReply != null) { OnPingReceived(new PingReceivedArgs(timestamp, pingReply.Address, hostname, pingReply.Status)); } } else { if (ipAddress.AddressFamily == AddressFamily.InterNetwork) { OnPingReceived(new PingReceivedArgs(timestamp, pingReply.Address, hostname, pingReply.Buffer.Length, pingReply.RoundtripTime, pingReply.Options.Ttl, pingReply.Status)); } else { OnPingReceived(new PingReceivedArgs(timestamp, pingReply.Address, hostname, pingReply.Buffer.Length, pingReply.RoundtripTime, pingReply.Status)); } } } catch (PingException ex) { errorCount++; if (errorCount == pingOptions.ExceptionCancelCount) { OnPingException(new PingExceptionArgs(ex.Message, ex.InnerException)); break; } } pingTotal++; // If ping is canceled... dont wait for example 5 seconds for (var i = 0; i < pingOptions.WaitTime; i += 100) { Thread.Sleep(100); if (cancellationToken.IsCancellationRequested) { break; } } } while ((pingOptions.Attempts == 0 || pingTotal < pingOptions.Attempts) && !cancellationToken.IsCancellationRequested); } if (cancellationToken.IsCancellationRequested) { OnUserHasCanceled(); } else { OnPingCompleted(); } }, cancellationToken); }
public void SendAsync(IPAddress ipAddress, PingOptions pingOptions, CancellationToken cancellationToken) { Task.Run(() => { int pingTotal = 0; int errorCount = 0; System.Net.NetworkInformation.PingOptions options = new System.Net.NetworkInformation.PingOptions { Ttl = pingOptions.TTL, DontFragment = pingOptions.DontFragment }; using (System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping()) { do { PingReply pingReply; try { // Get timestamp DateTime timestamp = DateTime.Now; // Send ping pingReply = ping.Send(ipAddress, pingOptions.Timeout, pingOptions.Buffer, options); // Reset the error count (if no exception was thrown) errorCount = 0; if (pingReply.Status == IPStatus.Success) { if (ipAddress.AddressFamily == AddressFamily.InterNetwork) { OnPingReceived(new PingReceivedArgs(timestamp, pingReply.Address, pingReply.Buffer.Count(), pingReply.RoundtripTime, pingReply.Options.Ttl, pingReply.Status)); } else { OnPingReceived(new PingReceivedArgs(timestamp, pingReply.Address, pingReply.Buffer.Count(), pingReply.RoundtripTime, pingReply.Status)); } } else { if (pingReply.Address == null) { OnPingReceived(new PingReceivedArgs(timestamp, ipAddress, pingReply.Status)); } else { OnPingReceived(new PingReceivedArgs(timestamp, pingReply.Address, pingReply.Status)); } } } catch (PingException ex) { errorCount++; if (errorCount == pingOptions.ExceptionCancelCount) { OnPingException(new PingExceptionArgs(ex.Message, ex.InnerException)); break; } } pingTotal++; // If ping is canceled... dont wait for example 5 seconds for (int i = 0; i < pingOptions.WaitTime; i += 100) { Thread.Sleep(100); if (cancellationToken.IsCancellationRequested) { break; } } } while ((pingOptions.Attempts == 0 || pingTotal < pingOptions.Attempts) && !cancellationToken.IsCancellationRequested); } if (cancellationToken.IsCancellationRequested) { OnUserHasCanceled(); } else { OnPingCompleted(); } }); }