当前位置: 首页 > news >正文

一个简单的端口扫描程序

   做一个简单的端口扫描程序

    界面:  

               

                   

    控件设置:

         IDC_EDIT_ADDR    关联 CString m_strAddr

         IDC_BOTTON_PORT_SCAN  

         IDC_LIST_TARGET  关联 CLISTBOX m_ListTarget  取消选中sort复选框

         IDC_LIST_RESULT  关联 CLISTBOX m_ListResult  取消选中sort复选框

   在主对话框类Port_ScanDlg.h 中添加     

#include <WinSock2.h>
#pragma comment(lib,"ws2_32.lib")


   在类Port_Scan.cpp 文件中加入需要扫描的端口数组和声明端口扫描线程入口函数:

  UINT nPortArray[14]={13,15,21,25,80,110,135,137,139,445,1025,1433,3306,53}; //需要扫描的端口数组

 DWORD WINAPI PortScanThreadProc(LPVOID pParam);    //端口扫描线程入口函数

  在类Port_ScanDl.cpp中加入以下代码,初始化网络环境和显示需要扫描的端口:

   

BOOL CPort_ScanDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	..........
	// TODO: 在此添加额外的初始化代码
	WSADATA wsadata;
	WSAStartup(MAKEWORD(2,2),&wsadata);       //启用socket
	CString strPort;
	for(int i=0;i<14;i++)
	{
		strPort.Format("%lu",nPortArray[i]);   //将数字转化为字符串
		m_ListTarget.AddString(strPort);  //列表中加入端口扫描的任务显示
	}


	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

在类Port_ScanDlg.cpp成员函数OnBnClickedButtonPortScan()中实现按钮“扫描端口”功能。

 

void CPort_ScanDlg::OnBnClickedButtonPortScan()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);  //将控件的内容读入到相关联的变量中
	if(m_strAddr.IsEmpty())
	{
		AfxMessageBox("请填写IP地址");
		return;
	}

	HANDLE hThread=CreateThread(NULL,0,PortScanThreadProc,this,0,NULL); //开启端口扫描线程
	CloseHandle(hThread);//关闭线程语句
	GetDlgItem(IDC_BUTTON_PORT_SCAN)->EnableWindow(FALSE);  //使得控件不可用

}

在在类Port_ScanDlg.cpp中实现扫描端口线程入口函数:

   

DWORD WINAPI PortScanThreadProc(LPVOID pParam)
{
	CPort_ScanDlg *pDlg=(CPort_ScanDlg *)pParam;
	sockaddr_in addr;
	addr.sin_family=AF_INET;
	addr.sin_addr.S_un.S_addr=inet_addr(pDlg->m_strAddr);  //从字符串IP转化为32位IP

	int nretval;
	struct timeval tv;
	
	DWORD lMode=1;
    fd_set fdsock;
//	SOCKET hSocket;
	tv.tv_sec=2;  //设置超时时间为2秒
	tv.tv_usec=0;
	//依次查看端口是否开放
	for (int i=0;i<14;i++)
	{
		//创建套接字
		SOCKET hSocket=socket(AF_INET,SOCK_STREAM,0);
		if(hSocket==INVALID_SOCKET)continue;
		//设置套接字为非阻塞型套接字
		ioctlsocket(hSocket,FIONBIO,&lMode);
         //清空fdsock 这个集合
		FD_ZERO(&fdsock);
		//将套接字装入fdsock集合
		FD_SET(hSocket,&fdsock);
		addr.sin_port=htons(nPortArray[i]);
		//连接主机
		nretval=connect(hSocket,(sockaddr *)&addr,sizeof(addr));
		if(nretval==SOCKET_ERROR)
		{
			//select模型
			nretval=select(0,NULL,&fdsock,NULL,&tv);
			//当存在此端口,select()函数返回值大于0
			if(nretval>0){
				pDlg->SendMessage(WM_ADDPORT,0,(LPARAM)&nPortArray[i]);
			}
		}
		else
		{
			pDlg->SendMessage(WM_ADDPORT,0,(LPARAM)&nPortArray[i]);
		}

		closesocket(hSocket);  //关闭套接字
	}
	AfxMessageBox("端口扫描完成!");
	pDlg->GetDlgItem(IDC_BUTTON_PORT_SCAN)->EnableWindow(TRUE);
	return 0L;
}
    最后实现 自定义消息WM_ADDPORT响应函数:LRESULT OnAddPort(WPARAM wParam,LPARAM lParam)

  

LRESULT CPort_ScanDlg::OnAddPort(WPARAM wParam,LPARAM lParam)
{
	UINT nPort = *(UINT*)lParam;
	CString strPort;
	strPort.Format("%lu", nPort);
	m_ListResult.AddString(strPort);
	return 0L;
}

  

相关文章:

  • 《BREW进阶与精通——3G移动增值业务运营、定制与开发》一书的网店地址
  • apue.h
  • Linux 临时mount 移动设备
  • 文件描述符、文件表项、V节点表项、dup
  • linux 第一个内核模块Hello World
  • Linux 根据端口查找进程
  • tshark命令行的使用
  • 联通iPhone,真的是狼来了?
  • GCC -L-l -D -I 参数的用法
  • 将SVN与BUG跟踪管理集成
  • Linux 内核中软中断机制
  • DAS、NAS、SAN...
  • Linux bridge 网桥模块内部数据包转发流程
  • C++ 标准库中的allocator是多余的
  • 数据结构与算法[LeetCode]—Linked List Cycle 确定单链表是否有环,并找出第一个环结点
  • $translatePartialLoader加载失败及解决方式
  • 【mysql】环境安装、服务启动、密码设置
  • Android交互
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • export和import的用法总结
  • extjs4学习之配置
  • Git 使用集
  • java2019面试题北京
  • js如何打印object对象
  • Netty 4.1 源代码学习:线程模型
  • underscore源码剖析之整体架构
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 工作中总结前端开发流程--vue项目
  • 构建二叉树进行数值数组的去重及优化
  • 构建工具 - 收藏集 - 掘金
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 漂亮刷新控件-iOS
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 硬币翻转问题,区间操作
  • 智能网联汽车信息安全
  • 正则表达式-基础知识Review
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #stm32驱动外设模块总结w5500模块
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C++17) optional的使用
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET连接数据库方式
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET中统一的存储过程调用方法(收藏)
  • /bin/rm: 参数列表过长"的解决办法
  • [ JavaScript ] JSON方法
  • [autojs]逍遥模拟器和vscode对接