// /** // * File: CrawlSubnet.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 ln.types.threads; using ln.types; using ln.skyscanner.entities; using System.Net.NetworkInformation; using ln.logging; using System.Linq; using ln.types.odb; using ln.types.net; namespace ln.skyscanner.crawl { public class CrawlNetwork : PoolJob { public Crawler Crawler { get; } public CrawledSubnet Subnet { get; } public Network4 Network { get; } public CrawlNetwork(Crawler crawler, CrawledSubnet subnet) { Crawler = crawler; Subnet = subnet; Network = subnet.Network; Name = String.Format("Subnet crawl {0}", subnet.Network); } public CrawlNetwork(Crawler crawler, CrawledSubnet subnet,Network4 network) { Crawler = crawler; Subnet = subnet; Network = network; Name = String.Format("Subnet crawl {0} [{1}]", subnet.Network, network); } private int maxScanWidth = 28; public override void RunJob() { if (Network.Width < maxScanWidth) { SplitJob(Network.Divide(maxScanWidth - (int)Network.Width).Select((n) => new CrawlNetwork(Crawler, Subnet, n)).ToArray()); return; } Ping ping = new Ping(); DateTime startTime = DateTime.Now; Logging.Log(LogLevel.INFO, "Scanning {0}", Subnet); int count = 0; foreach (IPv4 ip in Network) { count++; long roundTripTime = 0; int success = 0; int nPings = 6; for (int n = 0; n < nPings; n++) { State = String.Format("Sending ping #{0} of {1} to {2}",n,nPings,ip); Progress = (double)count / Network.Size; PingReply reply = ping.Send(ip, 250); if (reply.Status == IPStatus.Success) { success++; roundTripTime += reply.RoundtripTime; } } if (success > 0) { roundTripTime /= success; Logging.Log(LogLevel.INFO, "IP {0} reachable ({1}/10) {2}ms", ip, success, roundTripTime); Crawler.FindHostForIP(ip); } if (JobAbortRequested) break; } if (!JobAbortRequested) { Subnet.LastScan = startTime; Subnet.NextScan = startTime + TimeSpan.FromHours(24); } SkyScanner.Instance.Entities.CrawledSubnets.Upsert(Subnet); } public override int GetHashCode() { return Subnet.GetHashCode() ^ Network.GetHashCode(); } public override bool Equals(object obj) { if (obj is CrawlNetwork) { CrawlNetwork you = obj as CrawlNetwork; return Crawler.Equals(you.Crawler) && Subnet.Equals(you.Subnet) && Network.Equals(you.Network); } return false; } } }