using system; 
using system.drawing; 
using system.collections; 
using system.componentmodel; 
using system.windows.forms; 
//增加的如下.. 
using system.data; 
using system.net.sockets; 
using system.net; 
using system.io; 
using system.text; 
using system.threading; 
namespace iportscan 
{ 
 /// <summary> 
 /// summary description for form1. 
 /// </summary> 
 public class form1 : system.windows.forms.form 
 { 
  //该处放的是程序要用到的公共变量 
  public string scanhost = dns.gethostname(); //默认当前本机ip 
  public int32 tport = 0; //当前连接端口编号 
  public int32 connstate = 0; //扫描状态 
  public int portsum = 0 ; //端口总计 
  public bool endthread = false; //结束状态 
  public autoresetevent asyncopsaredone = new autoresetevent(false); 
  private system.windows.forms.label label1 = new label(); 
  private system.windows.forms.textbox txthostname; 
  private system.windows.forms.button cmdexec; 
  private system.windows.forms.listbox loglist; 
  public system.windows.forms.checkedlistbox portlist; 
  private system.windows.forms.label label2; 
  private system.windows.forms.label label3; 
  private system.windows.forms.numericupdown snum; 
  private system.windows.forms.numericupdown enum; 
  private system.windows.forms.checkbox showdie; 
  private system.windows.forms.label label4; 
  private system.windows.forms.button button1; 
  private system.windows.forms.tooltip tooltip1; 
  private system.windows.forms.statusbar statusbar1; 
  private system.windows.forms.linklabel linklabel1; 
  private system.windows.forms.linklabel linklabel2; 
  private system.componentmodel.icontainer components; 
  /* 
  此处省略了各个调用的控件的属性设置代码 
  */ 
  static void main() 
  { 
   application.run(new form1()); 
  } 
  private void cmdexec_click(object sender, system.eventargs e) 
  { 
   int32 startport = (int32)snum.value; 
   int32 endport = (int32)enum.value; 
   if(txthostname.text.length==0) 
   { 
    messagebox.show("请输入一个主机的名称吧!","系统提示"); 
    txthostname.text = scanhost.tostring(); 
    txthostname.focus(); 
    return; 
   } 
   if(startport>endport) 
   { 
    messagebox.show("错误,起始端口必须要小于结束的端口!","系统提示"); 
    startport = endport-1; 
    snum.text = startport.tostring(); 
    snum.focus(); 
    return ; 
   } 
   if(cmdexec.text=="&scan") 
   { 
    endthread= false; 
    cmdexec.text= "&stop"; 
   } 
   else 
   { 
    endthread= true; 
    cmdexec.text= "&scan"; 
   } 
   if(endthread!=true) 
   { 
    connstate = 0; 
    portsum = 0; 
    scanhost = txthostname.text; 
    try 
    { 
     ipaddress ipaddr =(ipaddress)dns.resolve(scanhost).addresslist.getvalue(0); 
     txthostname.text = ipaddr.tostring(); 
    } 
    catch 
    { 
     txthostname.focus(); 
     messagebox.show("请输入正确的主机地址,该地址dns无法解析","系统提示"); 
     return ; 
    } 
    loglist.items.clear(); 
    for (int32 threadnum = startport; threadnum <=endport; threadnum++) 
    { 
     threadpool.queueuserworkitem(new waitcallback(startscan),threadnum); 
     loglist.items.add ("扫描端口:" + threadnum.tostring()); 
    } 
   } 
  } 
  public void startscan(object state) 
  { 
   int32 port = (int32) state; 
   string tmsg = ""; 
   string getdata = ""; 
   int lindex = 0; 
   int eindex = 0; 
   connstate++; //判断线程数目 
   if(endthread==true) 
   { 
    if(connstate==((int32)enum.value-(int32)snum.value)) 
    { 
     cmdexec.text = "&scan"; 
     loglist.items.add ("扫描完毕!"); 
    } 
    else 
    { 
     cmdexec.text = "&stop"; 
     loglist.items.add ("正在停止对"+port.tostring()+"端口的扫描线程"); 
    } 
    loglist.items.add("结束线程:"+port.tostring()); 
    asyncopsaredone.close(); 
   } 
   else 
   { 
    try 
    { 
     tcpclient tcp = new tcpclient(); 
     tcp.connect(scanhost,port); 
     //该处如果建立连接错误的话,将不执行下面的代码.. 
     portsum ++; 
     lindex = portlist.items.add(port.tostring() + "端口开放",false); 
     portlist.selectedindex=lindex; 
     stream sm = tcp.getstream(); 
     sm.write(encoding.default.getbytes(tmsg.tochararray()),0,tmsg.length); 
     streamreader sr = new streamreader(tcp.getstream(),encoding.default); 
     getdata = sr.readline(); 
     if(lindex!=0&&getdata.length!=0) 
     { 
      tmsg = " +-" + port.tostring() + "端口数据:"+getdata.tostring(); 
      eindex = portlist.items.add(tmsg); //插入一条信息记录 
      portlist.items.insert(lindex+1,tmsg); 
      portlist.items.removeat(eindex); 
     } 
     sr.close(); 
     sm.close(); 
     tcp.close(); 
    } 
    catch 
    { 
     //显示坏死的端口 
     if(showdie.checked==true) 
     { 
      portlist.items.add(port.tostring()+"端口无法连接,回传数据为空"); 
     } 
    } 
    finally 
    { 
     thread.sleep(0); 
     loglist.items.add("结束线程:"+port.tostring()); 
     asyncopsaredone.close(); 
     statusbar1.text = "端口总计:"+portsum.tostring() ; 
     if(connstate==((int32)enum.value-(int32)snum.value)) 
     { 
      cmdexec.text = "&scan"; 
     } 
    } 
   } 
  } 
  private void button1_click(object sender, system.eventargs e) 
  { 
   application.exit(); 
  } 
 }
}
新闻热点
疑难解答