If you are looking for to ping a remote machine and you want to record the state along with status and return time, below example can help you.


       private void Ping_Click(object sender, EventArgs e)
            List domains = new List();

            foreach (string domain in domains)
                Ping pinger = new Ping();
                UserToken token = new UserToken() { Destination = domain, InitiatedTime = DateTime.Now };
                pinger.PingCompleted += new PingCompletedEventHandler(PingCompleted);
                pinger.SendAsync(domain, token);

        private void PingCompleted(object sender, PingCompletedEventArgs e)
            UserToken token = (UserToken)e.UserState;
            Debug.Assert(true, string.Format("Reply from {0} with the status {1}", token.Destination, e.Reply.Status));

        public class UserToken
            public string Destination { get; set; }
            public DateTime InitiatedTime { get; set; }


Always remember that the property e.Reply.Address will show up the correct destination IP address only if it is reachable. I would suggest you to go through the msdn urls http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.pingcompleted.aspx and http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.sendasync.aspx which will give you more insight.

Ping remote machines using .net