// /** // * File: ICMP.cs // * Author: haraldwolff // * // * This file and it's content is copyrighted by the Author and / or copyright holder. // * Any use wihtout proper permission is illegal and may lead to legal actions. // * // * // **/ using System; using System.Net.NetworkInformation; using ln.skyscanner.crawl.service; namespace ln.skyscanner.crawl.tests { public class ICMP : CrawlService { public static Ping Ping { get; private set; } = new Ping(); public ICMP() :base("ping") {} public override bool Check(Crawl crawl) { int nSuccess = 0; long roundTripTime = 0; for (int n = 0; n < 10; n++) { //HostCrawl.setState("ICMP check [{0}/10]", n); PingReply pingReply = Ping.Send(crawl.Host.PrimaryIP, 500); if (pingReply.Status == IPStatus.Success) { nSuccess++; roundTripTime += pingReply.RoundtripTime; } else if ((n > 3) && (nSuccess == 0)) { break; } } if (nSuccess > 0) { roundTripTime /= nSuccess; crawl.Host.SetHint("ping.success", true); crawl.Host.SetHint("ping.rta", (int)roundTripTime); crawl.Host.SetHint("ping.out_of_ten", nSuccess); crawl.Host.LastSeen = DateTime.Now; if (crawl.Host.FirstSeen < new DateTime(1970, 1, 2)) crawl.Host.FirstSeen = DateTime.Now; } else { crawl.Host.SetHint("ping.success", false); crawl.Host.SetHint("ping.rta", null); crawl.Host.SetHint("ping.out_of_ten", 0); } return true; } public override bool HostProvidesOption(Crawl crawl, params object[] parameters) { return crawl.Host.GetHint("ping.success", false); } } }