C#编写的多线程端口扫描程序

本文介绍了一个使用C#实现的端口扫描工具的源代码。该工具通过多线程方式并利用TCP协议来检查指定范围内主机的端口是否开放,并能够获取开放端口的服务信息。文章详细展示了如何进行DNS解析、建立TCP连接、读取端口数据及异常处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 static   void   Main()      
      {    
      connState   =   0;    
  portSum   =   0;    
  scanHost   =   "";//主机地址    
  try    
  {    
  IPAddress   ipaddr   =(IPAddress)Dns.Resolve(scanHost).AddressList.GetValue(0);    
  }    
  catch    
  {    
  MessageBox.Show("请输入正确的主机地址,该地址DNS无法解析","系统提示");    
  return   ;    
          }    
                 
          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";    
      }    
      }    
      }    
      }   
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值