`

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

阅读更多
 
  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;
  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();
  }
  
  总结:基于.Net 框架开发程序确实简单方便,并且功能强大。 
 
分享到:
评论

相关推荐

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

    采用多线程技术,实现了多主机,多端口的扫描,速度挺快!

    C#多线程端口扫描

    编写Windows应用程序,使用多线程技术实现局域网内指定主机IP地址的端口扫描程序,要求满足以下功能: 指定端口号范围,列出指定主机开放的TCP端口号及UDP端口号; 显示各端口号类型;

    用c#写的基于tcp的多线程端口扫描器

    使用c#编写端口扫描器相当简单,我做的也比较简单,没有实现特别多的功能,就是多线程,一两句相关socket语句就搞定了

    C# 端口扫描 线程操作

    窗口程序,输入IP、端口范围进行扫描,可以导出日志文件

    c#编写多线程

    自己编写的,感觉还不错!!!

    C#实现多线程TCPUDP端口扫描

    编写一个简单的主机端口扫描程序,要求能够探测目的主机的端口状态。 (1)要求用户可以在参数中输入需要扫描的目的主机的IP地址与端口,输出端口的状态信息。 (2)要求使用UDP协议进行端口的扫描过程。 (3)有...

    C#编写的端口扫描器

    使用C#开发的端口扫描器,使用多线程技术,可针对一个网段内的某个端口进行扫描,也可针对某个IP的一段端口进行扫描,并有简单的域名解析功能。 缺点:在扫描IP段的指定端口号时,只能支持24位掩码的扫描,如需扫描...

    计算机专业毕设asp.net多线程的TCP端口扫描程序的设计与实现(源代码+论文).rar

    **计算机专业毕业设计:基于ASP.NET的多线程TCP端口扫描程序的设计与实现** 本资源提供了一个全面且深入的计算机专业毕业设计项目,主题为“基于ASP.NET的多线程TCP端口扫描程序的设计与实现”。该项目通过结合ASP...

    C#源码大集合 02(共3卷)

    ├─多线程端口扫描程序 ├─多线程,多接收模式串口类 ├─实例10-多线程实例 ├─实例12-多线程互斥1 ├─实例13-多线程互斥2 ├─实例14-多线程互斥3 ├─实例63 如何编写多线程程序 ├─实例77-多线程1 ├...

    编程技巧(全部工程源代码,物超所值)

    VC++6.0多线程技术在端口扫描程序中的应用 VC++6.0多线程技术在端口扫描程序中的应用 让程序防病毒 用VC++5.06.0实现“更改图标”对话框 统一网内微机系统时钟的一种方案 用InstallShield制作商品化软件...

    Visual.C#.编程精彩百例

    实例80 网络端口扫描器 实例81 深入WinForms-地址簿应用(1) 实例82 深入WinForms--Image Viewer应用程序(2) 实例83 开饭时间提醒器(Meal Reminder) 实例84 服务器端C#实例 实例85 数字时钟设计技术 实例...

    C#源码大集合 03(共3卷)

    chap09-多线程 ├─D00-多线程 ├─Windows多线程编程技术与实例 ... ... ├─多线程,多接收模式串口类 ├─多线程文件传输 ├─多线程的日志记录DLL ├─多线程端口扫描程序 ├─多...

    C#源码大集合 01(共3卷)

    chap09-多线程 ├─D00-多线程 ├─Windows多线程编程技术与实例 ... ... ├─多线程,多接收模式串口类 ├─多线程文件传输 ├─多线程的日志记录DLL ├─多线程端口扫描程序 ├─多...

    《Visual.C#.编程精彩百例》配套光盘part1

    实例78 MDI窗体菜单设计(2) 实例79 创建一个C#编辑器 实例80 网络端口扫描器 实例81 深入WinForms-地址簿应用(1) 实例82 深入WinForms--Image Viewer应用程序(2) 实例83 开饭时间提醒...

    《Visual.C#.编程精彩百例》配套光盘.part2

    实例78 MDI窗体菜单设计(2) 实例79 创建一个C#编辑器 实例80 网络端口扫描器 实例81 深入WinForms-地址簿应用(1) 实例82 深入WinForms--Image Viewer应用程序(2) 实例83 开饭时间提醒...

    明日科技C#开发入门及项目实战

    实例180 使用多线程制作端口扫描工具 实例181 使用线程扫描局域网ip地址 实例182 使用线程休眠控制图片以百叶窗效果显示 实例183 使用线程控制向窗体中拖放图片并显示 实例184 使用线程制作动画效果的状态栏 实例185...

    Visual C#网络编程技术与实践源代码

    全书共分13章,主要内容包括网络编程原理、Visual C# 2005的套接字以及多线程的开发、基于各种不同协议的网络编程应用模块,并通过几个典型的实例介绍了Visual C# 2005网络编程的实际应用。 本书注重代码的通用性和...

    C#开发经验技巧宝典

    1083 如何扫描计算机端口号 653 1084 如何获得指定网页的源代码 654 1085 如何将指定URL数据下载到本地文件 654 1086 如何设置Internet浏览器外观 655 1087 如何将网址加入Internet收藏夹 655 1088 如何...

    Visual C# .NET精彩编程实例集锦

    实例63 如何编写多线程程序 实例64 如何编写DLL服务端程序 实例65 如何编写DLL客户端程序 实例66 如何编写用户控件程序 实例67 如何给程序打包 第4章 系统维护 ---------------------------------- 实例68 如何获取...

    Ladon5.8大型网络渗透扫描器&源码

    Ladon一款用于大型网络渗透的多线程插件化综合扫描神器,含端口扫描、服务识别、网络资产、密码爆破、高危漏洞检测以及一键GetShell,支持批量A段/B段/C段以及跨网段扫描,支持URL、主机、域名列表扫描。5.7版本内置...

Global site tag (gtag.js) - Google Analytics