📄 scandlg.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 + -