Exemple #1
0
 public static CustomPingReply Parse(EndPoint endPoint, IcmpPackage icmpResponse, long time)
 {
     return(new CustomPingReply
     {
         Address = ((IPEndPoint)endPoint).Address,
         Status = icmpResponse?.Type == IcmpType.EchoResponse ? IPStatus.Success : IPStatus.Unknown,
         ElapsedTime = time
     });
 }
Exemple #2
0
        public CustomPingReply Send(string host)
        {
            var destination = new IPEndPoint(GetAddressByHost(host), 0);

            var icmpPackage = new IcmpPackage {
                Type = IcmpType.EchoRequest, Payload = Guid.NewGuid().ToString("N")
            };
            var package = icmpPackage.Build();

            _timer.Restart();
            _socket.SendTo(package, destination);

            var buffer = new byte[package.Length * 2];

            try
            {
                int receivedByteCount;
                while (true)
                {
                    EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
                    receivedByteCount = _socket.ReceiveFrom(buffer, ref endPoint);

                    if (destination.Address.Equals(((IPEndPoint)endPoint).Address))
                    {
                        break;
                    }
                }
                _timer.Stop();
                return(CustomPingReply.Parse(destination,
                                             IcmpPackage.RestorePackage(buffer.Take(receivedByteCount).ToArray()), _timer.ElapsedMilliseconds));
            }
            catch (SocketException)
            {
                _timer.Stop();
                return(CustomPingReply.Parse(destination, null, _timer.ElapsedMilliseconds));
            }
        }
Exemple #3
0
        public Dictionary <int, List <TracertPingReply> > Send(string host, int hopsCount)
        {
            var destination = new IPEndPoint(GetAddressByHost(host), 0);

            var icmpPackage = new IcmpPackage {
                Type = IcmpType.EchoRequest, Payload = Guid.NewGuid().ToString("N")
            };
            var package = icmpPackage.Build();

            _timer.Restart();

            var traceRouteDict = new Dictionary <int, List <TracertPingReply> >();

            var timer = new Stopwatch();

            for (var i = 1; i <= hopsCount; i++)
            {
                _timer.Restart();
                traceRouteDict.Add(i, new List <TracertPingReply>());

                var buffer = new byte[package.Length * 2];
                try
                {
                    short ttl = 1;

                    int receivedByteCount;
                    while (ttl < 100)
                    {
                        _socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.IpTimeToLive, ttl);

                        ttl++;
                        _socket.SendTo(package, destination);
                        EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
                        try
                        {
                            receivedByteCount = _socket.ReceiveFrom(buffer, ref endPoint);
                        }
                        catch (Exception except)
                        {
                        }
                        //if(((IPEndPoint)endPoint).Address.ToString() != "0.0.0.0" )
                        //{
                        //}
                        traceRouteDict[i].Add(new TracertPingReply()
                        {
                            Address = ((IPEndPoint)endPoint).Address,
                            Time    = _timer.ElapsedMilliseconds
                        });

                        if (destination.Address.Equals(((IPEndPoint)endPoint).Address))
                        {
                            break;
                        }
                    }
                    _timer.Stop();
                }
                catch (SocketException exc)
                {
                    _timer.Stop();
                }

                traceRouteDict[i].Add(new TracertPingReply {
                    Time = timer.ElapsedMilliseconds, Address = destination.Address
                });
            }
            return(traceRouteDict);
        }