-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathScan.cs
131 lines (109 loc) · 3.8 KB
/
Scan.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
using NetTools;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Pinger
{
class Scan
{
public IPAddress Address { get; set; }
public int Timeout { get; set; }
public bool PortScan { get; set; }
public Scan(string ip, int timeout)
{
Address = IPAddress.Parse(ip);
Timeout = timeout;
PortScan = false;
}
public static IEnumerable<Scan> FromRange(string range, int timeout = 30)
{
return FromRange(IPAddressRange.Parse(range), timeout);
}
public static IEnumerable<Scan> FromRange(IPAddressRange range, int timeout = 30)
{
return range.AsEnumerable().Select(ip => new Scan(ip.ToString(), timeout));
}
public Task<ScanResult> Run()
{
return Task.Factory.StartNew(async () =>
{
var ping = await Ping();
var result = new ScanResult
{
IpAddress = this.Address,
Ping = ping
};
if (ping.Status != IPStatus.Success) return result;
result.Dns = await Resolve();
if (this.PortScan) result.Ports = await Ports();
return result;
}).Result;
}
public async Task<PingReply> Ping()
{
using (var ping = new Ping())
{
return await ping.SendPingAsync(this.Address, this.Timeout);
}
}
public async Task<string> Resolve()
{
try
{
var dns = await Dns.GetHostEntryAsync(this.Address);
return dns?.HostName;
}
catch (SocketException) { }
return null;
}
public async Task<List<KeyValuePair<int, string>>> Ports()
{
return await Task.Factory.StartNew(() =>
{
var port = 1;
var buffer = new byte[128];
var results = new List<KeyValuePair<int, string>>();
while (port < 100)
{
var endpoint = new IPEndPoint(this.Address, port);
using (var socket = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp)
{
ReceiveTimeout = this.Timeout
})
{
try
{
socket.Connect(endpoint);
//socket.Receive(buffer, buffer.Length, 0);
if (socket.Connected)
{
if (buffer.Length == 0)
{
buffer = new byte[1024];
socket.Send(buffer, buffer.Length, SocketFlags.None);
socket.Receive(buffer);
if (buffer.Length == 0) buffer = Encoding.UTF8.GetBytes("UNKNOWN");
}
var info = Encoding.UTF8.GetString(buffer);
results.Add(new KeyValuePair<int, string>(port, info));
}
}
catch
{
continue;
}
finally
{
port++;
}
}
}
return results;
});
}
}
}