Beispiel #1
0
        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);
        }
Beispiel #2
0
        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();
                }
            });
        }