using system;
using system.collections.generic;
using system.text;
using system.net;
using system.net.sockets;
using system.threading;
namespace portscanner
{
class program
//已扫描端口数目
internal static int scannedcount = 0;
//正在运行的线程数目
internal static int runningthreadcount = 0;
//打开的端口数目
internal static list<int> openedports = new list<int>();
//起始扫描端口
static int startport = 1;
//结束端口号
static int endport = 500;
//最大工作线程数
static int maxthread = 10;
static void main(string[] args)
{
//接收传入参数一作为要扫描的主机
string host = "192.168.0.1";
//接收传入参数二作为端口扫描范围,如1-4000
string portrange = "1-400";
startport = int.parse(portrange.split('-')[0].trim());
endport = int.parse(portrange.split('-')[1].trim());
for (int port = startport; port < endport; port++)
{
//创建扫描类
scanner scanner = new scanner(host, port);
thread thread = new thread(new threadstart(scanner.scan));
thread.name = port.tostring();
thread.isbackground = true;
//启动扫描线程
thread.start();
runningthreadcount++;
thread.sleep(10);
//循环,直到某个线程工作完毕才启动另一新线程,也可以叫做推拉窗技术
while (runningthreadcount >= maxthread) ;
}
//空循环,直到所有端口扫描完毕
while (scannedcount + 1 < (endport - startport)) ;
console.writeline();
//输出结果
console.writeline("scan for host: {0} has been completed , /n total {1} ports scanned, /nopened ports :{2}",
host, (endport - startport), openedports.count);
foreach (int port in openedports)
console.writeline("/tport: {0} is open", port.tostring().padleft(6));
}
}
//扫描类
class scanner
string m_host;
int m_port;
public scanner(string host, int port)
m_host = host; m_port = port;
public void scan()
//我们直接使用比较高级的tcpclient类
tcpclient tc = new tcpclient();
//设置超时时间
tc.sendtimeout = tc.receivetimeout = 2000;
try
//console.write("checking port: {0}", m_port);
//尝试连接
tc.connect(m_host, m_port);
if (tc.connected)
{
//如果连接上,证明此端口为开放状态
console.writeline("port {0} is open", m_port.tostring().padright(6));
program.openedports.add(m_port);
}
catch (system.net.sockets.socketexception e)
//容错处理
console.writeline("port {0} is closed", m_port.tostring().padright(6));
//console.writeline(e.message);
}
finally
{
tc.close();
tc = null;
program.scannedcount++;
program.runningthreadcount--;
//console.writeline(program.scannedcount);
}