⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scandlg.cpp

📁 查询主机的相关信息。。如主机名。。主机IP。。网卡信息。。DNS信息等
💻 CPP
字号:
// ScanDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "NetInfo.h"
#include "ScanDlg.h"


// CScanDlg 对话框

IMPLEMENT_DYNAMIC(CScanDlg, CDialog)

CScanDlg::CScanDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CScanDlg::IDD, pParent)
	, m_iPort1(0)
	, m_iPort2(0)
	, m_iPort3(0)
	, m_iTry(0)
	{
}

CScanDlg::~CScanDlg()
{
}

void CScanDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_SCAN, m_listScan);
DDX_Control(pDX, IDC_IPADDR, m_cIpAddr);
DDX_Control(pDX, IDC_RADIO1, m_rChoose);
DDX_Text(pDX, IDC_EDIT_PORT1, m_iPort1);
DDV_MinMaxInt(pDX, m_iPort1, 0, 65535);
DDX_Text(pDX, IDC_EDIT_PORT2, m_iPort2);
DDV_MinMaxInt(pDX, m_iPort2, 0, 65535);
DDX_Text(pDX, IDC_EDIT_PORT3, m_iPort3);
DDV_MinMaxInt(pDX, m_iPort3, 0, 65535);
DDX_Text(pDX, IDC_EDIT_SUM, m_iTry);
DDX_Control(pDX, IDC_PROGRESS1, m_cProgress);
	}


BEGIN_MESSAGE_MAP(CScanDlg, CDialog)
	ON_BN_CLICKED(IDC_BTN_START, &CScanDlg::OnBnClickedBtnStart)
	ON_BN_CLICKED(IDC_BTNSTOP, &CScanDlg::OnBnClickedBtnstop)
END_MESSAGE_MAP()


// CScanDlg 消息处理程序

BOOL CScanDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	
	//初始化scan结果
	m_listScan.InsertColumn(0, "IP地址", 0, 100, 0);
	m_listScan.InsertColumn(1, "端口号", 0, 55, 0);
	m_listScan.InsertColumn(2, "端口状态", 0, 60 ,0);
	m_listScan.InsertColumn(3, "连接数次", 0, 60 ,0);
	//m_listScan.InsertColumn(4, "备注", 0, 100 ,0);
	
	m_rChoose.SetCheck(true);	//默认为扫描一个端口

	return TRUE;				// 除非将焦点设置到控件,否则返回 TRUE
}
void CScanDlg::OnBnClickedBtnStart()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);				//将文本框的值传给变量
	//获取扫描的IP地址	
	BYTE   nArrIP[4];   
	m_cIpAddr.GetAddress(nArrIP[0],nArrIP[1],nArrIP[2],nArrIP[3]);   
    //存取为字符串  
	m_strIP.Format("%d.%d.%d.%d",nArrIP[0],nArrIP[1],nArrIP[2],nArrIP[3]);
	
	InitSocket();				//初始化本地socket相关
	isStop = false;				//控件停止键
	m_listScan.DeleteAllItems();			//清空上一次的扫描结果
	m_cProgress.SetRange(0,1);
	m_cProgress.SetPos(0);
	
	if(m_rChoose.GetCheck())				//选择了单个端口进行扫描
		{
			m_iPort = m_iPort1;				//接收要扫描的端口
			ScanSPort(m_iPort);				//扫描端口
			m_cProgress.SetRange(0,1);
			m_cProgress.SetPos(1);
		}
	else
		{
			//ScanMPort();					//扫描多个端口
			AfxBeginThread(ThreadDeal, this);
		}
	
}

// 初始化socket相关
void CScanDlg::InitSocket(void)
{
	//初始化socket	
	Local_Sock = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);			//本地socket
	if(Local_Sock == INVALID_SOCKET)
		{
		//错误处理
		MessageBox("create socket error");
		}
	//---------------------------绑定远程IP,等扫描的IP地址-----------------------------------
	const char* c_ip =(LPCSTR)m_strIP;						  //将CString类型转换为char*												
	Far_Addr.sin_family = AF_INET;
	Far_Addr.sin_addr.s_addr = inet_addr(m_strIP);			  //IP
}

// 扫描单个端口
void CScanDlg::ScanSPort(int port)
{
		if(isStop)
		{
			AfxEndThread(0,1);
		}										//判断是否要停止扫描

	Far_Addr.sin_port = htons(m_iPort);								  //扫描端口
	
	//将整一型端口转换为字符串型
	CString s_Port;
	s_Port.Format("%d", m_iPort);
	
	//尝试连接变量,看有没开
	int ConnectResult;
	int itry = 1;					//尝试次数
	CString stry = "";				//将整型转换成字符串
	
	while( itry <= m_iTry)		//尝试多次连接
	{
		
		//连接
		ConnectResult = connect(Local_Sock ,(sockaddr*)(&Far_Addr),sizeof(sockaddr));
		if(ConnectResult == 0)
			{   
				m_listScan.InsertItem(0, m_strIP);				//显示IP地址
				m_listScan.SetItemText(0, 1, s_Port);			//显示IP端口
				m_listScan.SetItemText(0, 2, "活动");
				stry.Format("%d", itry);
				m_listScan.SetItemText(0, 3, stry);
				//closesocket(Local_Sock);
				Local_Sock = socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
				break;
				
			}
		else
			{
				itry++;				//尝试下一次连接
			}
	}
	
	//在设置的连接次数内不成功时
	if((itry -1) == m_iTry)
		{
			m_listScan.InsertItem(0, m_strIP);				//显示IP地址
			m_listScan.SetItemText(0, 1, s_Port);			//显示IP端口
			m_listScan.SetItemText(0, 2, "未活动");
			stry.Format("%d", m_iTry);
			m_listScan.SetItemText(0, 3, stry);
		}
		//m_listScan.UpdateWindow();
}

// 扫描多个端口
void CScanDlg::ScanMPort(void)
{
	if(m_iPort2 > m_iPort3)
		{
			MessageBox("结束端口要大于初始端口");
		}

	int plength = m_iPort3 - m_iPort2;		//进度条长度
	int i = 1;
	m_cProgress.SetRange(0,plength);		//设置范围

	m_iPort = m_iPort2;
	while(m_iPort <= m_iPort3)			//端口区间
	{ 
		ScanSPort(m_iPort);			//传入端口进行扫描
		//AfxBeginThread(ThreadDeal,this);
		m_cProgress.SetPos(i);
		i++;
		m_iPort++;
	}
}


//将扫描用一个线程来处理
UINT ThreadDeal(LPVOID pm)
{	
    CScanDlg *scan = (CScanDlg*) pm;
	scan->ScanMPort();	
	return true;
}


void CScanDlg::OnBnClickedBtnstop()
{
	// TODO: 在此添加控件通知处理程序代码
	//
	isStop = true;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -