# aardio 范例: 可用端口扫描工具



```aardio
//可用端口扫描工具
import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var winform = win.form(text="多线程端口扫描";right=759;bottom=469)
winform.add(
btnScan={cls="button";text='\uF002  检测开放的TCP端口';left=344;top=9;right=545;bottom=35;dl=1;dt=1;font=LOGFONT(name='FontAwesome');z=5};
edit={cls="edit";left=20;top=68;right=728;bottom=435;db=1;dl=1;dr=1;dt=1;edge=1;multiline=1;z=1};
editIp={cls="edit";text="www.example.com";left=120;top=11;right=332;bottom=35;dl=1;dt=1;edge=1;z=3};
editPortFrom={cls="edit";text="1";left=120;top=41;right=163;bottom=64;dl=1;dt=1;edge=1;num=1;z=6};
editPortTo={cls="edit";text="2048";left=202;top=40;right=245;bottom=63;dl=1;dt=1;edge=1;num=1;z=7};
progress={cls="progress";left=22;top=443;right=725;bottom=465;db=1;dl=1;dr=1;edge=1;hide=1;max=100;min=0;z=2};
static={cls="static";text="域名或IP：";left=19;top=13;right=115;bottom=34;align="right";dl=1;dt=1;transparent=1;z=4};
static2={cls="static";text='\uF061';left=167;top=41;right=190;bottom=59;align="right";dl=1;dt=1;font=LOGFONT(h=-16;name='FontAwesome');transparent=1;z=8};
static3={cls="static";text="端口范围：";left=19;top=40;right=115;bottom=61;align="right";dl=1;dt=1;transparent=1;z=9}
)
/*}}*/

import thread.works; 
var scanWorks = thread.works( 256/*线程数*/,
	function(host) {
		import wsock.tcp.client;
		var client = wsock.tcp.client();  
		host.valid = client.connectTimeout(host.ip,host.port,0.5); 
		client.close(); 
		
		return host;
	},/*等待延时*/,/*初始化函数*/
);

import win.timer;
var timer = win.timer(winform,10);//创建定时器
timer.disable()
 
timer.onTimer = function(){ 
	
	//获取扫描结果
	while( var host = scanWorks.pop() ) { 
		if( host.valid ) winform.edit.print('可连接 TCP 端口：',host.port)
		elseif( scanWorks.finished() ){
			if(winform.pushing) return;
			
			timer.disable();
			winform.btnScan.disabledText = null;
			winform.progress.visible = false;
			winform.edit.print("检测完成！")
		}
		else {
			winform.progress.stepIt();
		} 	
	}
}

winform.btnScan.oncommand = function(id,event){
    var portFrom,portTo = tonumber(winform.editPortFrom.text),tonumber(winform.editPortTo.text);
    winform.progress.visible = true;
	winform.progress.setRange(portFrom,portTo);
	winform.progress.step = 1;

	winform.btnScan.disabledText = {'\uF254';'\uF251';'\uF252';'\uF253';'\uF250'}
	scanWorks.clear(); 
	timer.enable();
	
	winform.pushing = true;
	var ip = winform.editIp.text;
	for(port=portFrom;portTo){
		scanWorks.push({port=port;ip=ip});
		
		if( null === win.peekPumpMessage() ){
			break;
		}
	} 
	winform.pushing = false
}

winform.show();
win.loopMessage();
scanWorks.quit();
```

