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 框架开发程序确实简单方便,并且功能强大。
分享到:
相关推荐
采用多线程技术,实现了多主机,多端口的扫描,速度挺快!
编写Windows应用程序,使用多线程技术实现局域网内指定主机IP地址的端口扫描程序,要求满足以下功能: 指定端口号范围,列出指定主机开放的TCP端口号及UDP端口号; 显示各端口号类型;
使用c#编写端口扫描器相当简单,我做的也比较简单,没有实现特别多的功能,就是多线程,一两句相关socket语句就搞定了
窗口程序,输入IP、端口范围进行扫描,可以导出日志文件
自己编写的,感觉还不错!!!
编写一个简单的主机端口扫描程序,要求能够探测目的主机的端口状态。 (1)要求用户可以在参数中输入需要扫描的目的主机的IP地址与端口,输出端口的状态信息。 (2)要求使用UDP协议进行端口的扫描过程。 (3)有...
使用C#开发的端口扫描器,使用多线程技术,可针对一个网段内的某个端口进行扫描,也可针对某个IP的一段端口进行扫描,并有简单的域名解析功能。 缺点:在扫描IP段的指定端口号时,只能支持24位掩码的扫描,如需扫描...
**计算机专业毕业设计:基于ASP.NET的多线程TCP端口扫描程序的设计与实现** 本资源提供了一个全面且深入的计算机专业毕业设计项目,主题为“基于ASP.NET的多线程TCP端口扫描程序的设计与实现”。该项目通过结合ASP...
├─多线程端口扫描程序 ├─多线程,多接收模式串口类 ├─实例10-多线程实例 ├─实例12-多线程互斥1 ├─实例13-多线程互斥2 ├─实例14-多线程互斥3 ├─实例63 如何编写多线程程序 ├─实例77-多线程1 ├...
VC++6.0多线程技术在端口扫描程序中的应用 VC++6.0多线程技术在端口扫描程序中的应用 让程序防病毒 用VC++5.06.0实现“更改图标”对话框 统一网内微机系统时钟的一种方案 用InstallShield制作商品化软件...
实例80 网络端口扫描器 实例81 深入WinForms-地址簿应用(1) 实例82 深入WinForms--Image Viewer应用程序(2) 实例83 开饭时间提醒器(Meal Reminder) 实例84 服务器端C#实例 实例85 数字时钟设计技术 实例...
chap09-多线程 ├─D00-多线程 ├─Windows多线程编程技术与实例 ... ... ├─多线程,多接收模式串口类 ├─多线程文件传输 ├─多线程的日志记录DLL ├─多线程端口扫描程序 ├─多...
chap09-多线程 ├─D00-多线程 ├─Windows多线程编程技术与实例 ... ... ├─多线程,多接收模式串口类 ├─多线程文件传输 ├─多线程的日志记录DLL ├─多线程端口扫描程序 ├─多...
实例78 MDI窗体菜单设计(2) 实例79 创建一个C#编辑器 实例80 网络端口扫描器 实例81 深入WinForms-地址簿应用(1) 实例82 深入WinForms--Image Viewer应用程序(2) 实例83 开饭时间提醒...
实例78 MDI窗体菜单设计(2) 实例79 创建一个C#编辑器 实例80 网络端口扫描器 实例81 深入WinForms-地址簿应用(1) 实例82 深入WinForms--Image Viewer应用程序(2) 实例83 开饭时间提醒...
实例180 使用多线程制作端口扫描工具 实例181 使用线程扫描局域网ip地址 实例182 使用线程休眠控制图片以百叶窗效果显示 实例183 使用线程控制向窗体中拖放图片并显示 实例184 使用线程制作动画效果的状态栏 实例185...
全书共分13章,主要内容包括网络编程原理、Visual C# 2005的套接字以及多线程的开发、基于各种不同协议的网络编程应用模块,并通过几个典型的实例介绍了Visual C# 2005网络编程的实际应用。 本书注重代码的通用性和...
1083 如何扫描计算机端口号 653 1084 如何获得指定网页的源代码 654 1085 如何将指定URL数据下载到本地文件 654 1086 如何设置Internet浏览器外观 655 1087 如何将网址加入Internet收藏夹 655 1088 如何...
实例63 如何编写多线程程序 实例64 如何编写DLL服务端程序 实例65 如何编写DLL客户端程序 实例66 如何编写用户控件程序 实例67 如何给程序打包 第4章 系统维护 ---------------------------------- 实例68 如何获取...
Ladon一款用于大型网络渗透的多线程插件化综合扫描神器,含端口扫描、服务识别、网络资产、密码爆破、高危漏洞检测以及一键GetShell,支持批量A段/B段/C段以及跨网段扫描,支持URL、主机、域名列表扫描。5.7版本内置...