ln.skyscanner/crawl/service/TCP.cs

84 lines
2.4 KiB
C#

// /**
// * File: TCP.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.Sockets;
namespace ln.skyscanner.crawl.service
{
public class TCP : CrawlService
{
public int[] Ports { get; }
public TCP(int[] ports)
:base("tcp")
{
Ports = ports;
}
public override bool Check(Crawl crawl)
{
if (!crawl.CheckRequiredOption("ping"))
return false;
int n = 0;
foreach (int port in Ports)
{
crawl.UpdateState(this, (double)n / (double)Ports.Length);
try
{
using (TcpClient tcpClient = new TcpClient())
{
IAsyncResult ar = tcpClient.BeginConnect(crawl.Host.PrimaryIP.ToString(), port, null, null);
System.Threading.WaitHandle wh = ar.AsyncWaitHandle;
try
{
if (!ar.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1), false))
{
tcpClient.Close();
throw new TimeoutException();
}
tcpClient.EndConnect(ar);
}
catch (Exception)
{
throw;
}
tcpClient.Close();
crawl.Host.SetHint(String.Format("tcp.{0}", port), true);
}
}
catch (Exception)
{
crawl.Host.SetHint(String.Format("tcp.{0}", port), false);
}
}
return true;
}
public override bool HostProvidesOption(Crawl crawl,params object[] parameters)
{
if (parameters.Length == 0)
return false;
foreach (object oport in parameters)
{
int port = (int)oport;
if (!crawl.Host.GetHint(String.Format("tcp.{0}", port),false))
return false;
}
return true;
}
}
}