www.pudn.com > NetDefender2.rar > PortScanDlg.cpp


// PortScanDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "fire.h" 
#include "PortScanDlg.h" 
#include  
#include  
#include  
#include  
#include "TheSocket.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CPortScanDlg dialog 
 
 
CPortScanDlg::CPortScanDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CPortScanDlg::IDD, pParent) 
{ 
 
	m_pColumns = new CStringList; 
	ASSERT(m_pColumns); 
	m_bSinglePort = TRUE; 
	m_nMaxAttempts = 1;	//default value, This value has been set on the window 
	m_pStatusList = new CPtrList; 
	ASSERT(m_pStatusList); 
	//{{AFX_DATA_INIT(CPortScanDlg) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
} 
 
CPortScanDlg::~CPortScanDlg() 
{ 
	if (m_pStatusList) 
	{ 
		//First Empty the port status list: 
		POSITION p = m_pStatusList->GetHeadPosition(); 
		while (p) 
		{ 
			POSITION temp = p; 
			DATA* pNode = (DATA*)m_pStatusList->GetNext(p); 
			m_pStatusList->RemoveAt(temp); 
			if (pNode) 
				delete pNode; 
		} 
		//Then remove it from heap: 
		delete m_pStatusList; 
	} 
} 
 
 
void CPortScanDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CPortScanDlg) 
	DDX_Control(pDX, IDC_STATUS_BAR, m_static); 
	DDX_Control(pDX, IDC_PROGRESS, m_cProgress); 
	DDX_Control(pDX, IDC_LIST_RESULT, m_cResult); 
	DDX_Control(pDX, IDC_IP_ADDRESS, m_cIP); 
	DDX_Control(pDX, IDC_EDIT_SINGLE_PORT_TO, m_cPortTo); 
	DDX_Control(pDX, IDC_EDIT_SINGLE_PORT_FROM, m_cPortFrom); 
	DDX_Control(pDX, IDC_EDIT_SINGLE_PORT, m_cSinglePort); 
	DDX_Control(pDX, IDC_EDIT_ATTEMPTS, m_cAttempts); 
	DDX_Control(pDX, IDC_BUTTON_STOP, m_cBtnStop); 
	DDX_Control(pDX, IDC_BUTTON_SCAN, m_cBtnScan); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CPortScanDlg, CDialog) 
	//{{AFX_MSG_MAP(CPortScanDlg) 
	ON_WM_SHOWWINDOW() 
	ON_BN_CLICKED(IDC_RADIO_SINGLE, OnRadioSingle) 
	ON_BN_CLICKED(IDC_RADIO_RANGE, OnRadioRange) 
	ON_BN_CLICKED(IDC_BUTTON_SCAN, OnButtonScan) 
	ON_BN_CLICKED(IDC_BUTTON_STOP, OnButtonStop) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CPortScanDlg message handlers 
 
BOOL CPortScanDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	// TODO: Add extra initialization here 
	//***************************************************** 
	AddHeader(_T("IP address")); 
	AddHeader(_T("Port number")); 
	AddHeader(_T("Port Status")); 
	AddHeader(_T("Attempts")); 
	AddHeader(_T("Remarks")); 
	///////////////////////////// 
	ShowHeaders(); 
	CheckRadioButton(IDC_RADIO_SINGLE,IDC_RADIO_RANGE,IDC_RADIO_SINGLE); 
	m_cSinglePort.EnableWindow(); 
	m_cPortFrom.EnableWindow(FALSE); 
	m_cPortTo.EnableWindow(FALSE); 
	//	m_cBtnStop.EnableWindow(FALSE); 
	m_cAttempts.SetWindowText(_T("1")); 
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
 
//************************************************************* 
BOOL CPortScanDlg::AddColumn(LPCTSTR strItem,int nItem,int nSubItem,int nMask,int nFmt) 
{ 
	LV_COLUMN lvc; 
	lvc.mask = nMask; 
	lvc.fmt = nFmt; 
	lvc.pszText = (LPTSTR) strItem; 
	lvc.cx = m_cResult.GetStringWidth(lvc.pszText) + 25; 
	if(nMask & LVCF_SUBITEM) 
	{ 
		if(nSubItem != -1) 
			lvc.iSubItem = nSubItem; 
		else 
			lvc.iSubItem = nItem; 
	} 
	return m_cResult.InsertColumn(nItem,&lvc); 
} 
 
BOOL CPortScanDlg::AddItem(int nItem,int nSubItem,LPCTSTR strItem ,int nImageIndex) 
{ 
	LV_ITEM lvItem; 
	lvItem.mask = LVIF_TEXT; 
	lvItem.iItem = nItem; 
	lvItem.iSubItem = nSubItem; 
	lvItem.pszText = (LPTSTR) strItem; 
 
	if(nImageIndex != -1) 
	{ 
		lvItem.mask |= LVIF_IMAGE; 
		lvItem.iImage |= LVIF_IMAGE; 
	} 
 
	if(nSubItem == 0) 
		return m_cResult.InsertItem(&lvItem); 
 
	return m_cResult.SetItem(&lvItem); 
} 
 
void CPortScanDlg::AddHeader(LPTSTR hdr) 
{ 
	if (m_pColumns) 
		m_pColumns->AddTail(hdr); 
} 
 
void CPortScanDlg::ShowHeaders() 
{ 
	int nIndex = 0; 
	POSITION pos = m_pColumns->GetHeadPosition(); 
	while (pos) 
	{ 
		CString hdr = (CString)m_pColumns->GetNext(pos); 
		AddColumn(hdr,nIndex++); 
	} 
} 
BOOL CPortScanDlg::TestConnection(CString IP, UINT nPort) 
{ 
	CTheSocket* pSocket; 
	pSocket = new CTheSocket; 
	ASSERT(pSocket); 
 
	if (!pSocket->Create()) 
	{ 
		delete pSocket; 
		pSocket = NULL; 
		return FALSE; 
	} 
 
	while (!pSocket->Connect(IP , nPort)) 
	{ 
		delete pSocket; 
		pSocket = NULL; 
		return FALSE; 
	} 
 
	pSocket->Close(); 
	delete pSocket; 
	return TRUE; 
} 
 
void CPortScanDlg::OnShowWindow(BOOL bShow, UINT nStatus)  
{ 
	CDialog::OnShowWindow(bShow, nStatus); 
	 
	// TODO: Add your message handler code here 
	//************************************************* 
	AddHeader(_T("IP address")); 
	AddHeader(_T("Port number")); 
	AddHeader(_T("Port Status")); 
	AddHeader(_T("Attempts")); 
	AddHeader(_T("Remarks")); 
	 
} 
void CPortScanDlg::OnRadioSingle()  
{ 
	m_bSinglePort = TRUE; 
	m_cSinglePort.EnableWindow(); 
	m_cPortFrom.EnableWindow(FALSE); 
	m_cPortTo.EnableWindow(FALSE); 
} 
 
void CPortScanDlg::OnRadioRange()  
{ 
	m_bSinglePort = FALSE; 
	m_cSinglePort.EnableWindow(FALSE); 
	m_cPortFrom.EnableWindow(); 
	m_cPortTo.EnableWindow(); 
	m_cBtnStop.EnableWindow(FALSE); 
} 
 
void CPortScanDlg::OnButtonScan()  
{ 
	CString btnTxt,IP; 
	UINT nSinglePort; 
	BYTE f1,f2,f3,f4; 
	TCHAR temp[10] = "\0"; 
 
	m_cProgress.SetPos(0); 
	m_cResult.DeleteAllItems(); 
 
	//Empty the port status list: 
	POSITION p = m_pStatusList->GetHeadPosition(); 
	while (p) 
	{ 
		POSITION temp = p; 
		DATA* pNode = (DATA*)m_pStatusList->GetNext(p); 
		m_pStatusList->RemoveAt(temp); 
		if (pNode) 
			delete pNode; 
	} 
 
	if (m_cIP.IsBlank()) 
	{ 
		MessageBox(_T("Please specify the remote machine's IP address."), 
			_T("Error"), 
			MB_OK | MB_ICONEXCLAMATION); 
		return; 
	} 
	 
	if (m_cIP.GetAddress(f1,f2,f3,f4) < 4) 
	{ 
		MessageBox(_T("Please specify the IP address again."), 
			_T("Invalid IP address"),MB_OK | MB_ICONEXCLAMATION); 
		return; 
	} 
 
	IP = _itoa(f1,temp,10); 
	IP += _T('.'); 
	IP += _itoa(f2,temp,10); 
	IP += _T('.'); 
	IP += _itoa(f3,temp,10); 
	IP += _T('.'); 
	IP += _itoa(f4,temp,10); 
 
	m_cBtnStop.EnableWindow(); 
	m_cBtnScan.EnableWindow(FALSE); 
 
	if (m_bSinglePort) 
	{ 
		CString port; 
		m_cSinglePort.GetWindowText(port); 
		m_minPort = m_maxPort = nSinglePort = atoi(port); 
	} 
	else 
	{ 
		CString port1,port2; 
		m_cPortFrom.GetWindowText(port1); 
		m_cPortTo.GetWindowText(port2); 
		m_minPort = atoi(port1); 
		m_maxPort = atoi(port2); 
		m_cProgress.SetRange32(0,m_maxPort - m_minPort+1); 
		m_cProgress.SetStep(1); 
	} 
 
	 
	if (!m_bSinglePort && m_maxPort < m_minPort) 
	{ 
		MessageBox(_T("The maximum range cannot be less than the minimum one."), 
			_T("Caution"), 
			MB_OK | MB_ICONINFORMATION); 
		return; 
	} 
 
	UINT m_nMaxAttempts = GetDlgItemInt(IDC_EDIT_ATTEMPTS); 
 
	for (m_nCounter = m_minPort; m_nCounter <= m_maxPort; m_nCounter++) 
	{ 
		BOOL bIsOpen = FALSE; 
		UINT nAttempt = 1; 
		 
		while(nAttempt <= m_nMaxAttempts && !bIsOpen) 
		{ 
			TCHAR temp[10]="\0"; 
			CString str = _T("Trying port# "); 
#ifdef _UNICODE 
			str += _itow(m_nCounter,temp,10); 
#else 
			str += itoa(m_nCounter,temp,10); 
#endif 
			str += _T(", IP Address="); 
			str += IP; 
			str += _T(", Attempt="); 
#ifdef _UNICODE 
			str += _itow(nAttempt,temp,10); 
#else 
			str += itoa(nAttempt,temp,10); 
#endif 
			m_static.SetWindowText(str);//; 
			str.Empty(); 
			bIsOpen = TestConnection(IP,m_nCounter); 
 
			if (bIsOpen) 
			{ 
				DATA* pNode = new DATA; 
				ASSERT(pNode); 
				strcpy(pNode->IPAddress,IP.GetBuffer(IP.GetLength())); 
				strcpy(pNode->port,_itoa(m_nCounter,temp,10)); 
				pNode->bStatus = 1; //open 
				pNode->nAttempts = nAttempt; 
				m_pStatusList->AddTail(pNode); 
			} 
			nAttempt++; 
		} 
 
		if (!bIsOpen) 
		{ 
			DATA* pNode = new DATA; 
			ASSERT(pNode); 
			strcpy(pNode->IPAddress,IP.GetBuffer(IP.GetLength())); 
			strcpy(pNode->port,_itoa(m_nCounter,temp,10)); 
			pNode->bStatus = 0; //close 
			pNode->nAttempts = nAttempt-1; 
			m_pStatusList->AddTail(pNode); 
		} 
		 
		MSG message; 
		if (::PeekMessage(&message,NULL,0,0,PM_REMOVE)) 
		{ 
			::TranslateMessage(&message); 
			::DispatchMessage(&message); 
		} 
		m_cProgress.StepIt(); 
	} 
	m_static.SetWindowText((CString)_T("Ready")); 
	m_cBtnScan.EnableWindow(); 
	m_cBtnStop.EnableWindow(FALSE); 
 
	//Filling report view: 
	UINT nIndex = 0; 
	POSITION pos = m_pStatusList->GetHeadPosition(); 
	while (pos) 
	{ 
		DATA* pNode = (DATA*)m_pStatusList->GetNext(pos); 
		AddItem(nIndex,0,pNode->IPAddress); 
		AddItem(nIndex,1,pNode->port); 
		if (pNode->bStatus) 
		{ 
			AddItem(nIndex,2,_T("Open")); 
			AddItem(nIndex,4,_T("*")); 
		} 
		else 
		{ 
			AddItem(nIndex,2,_T("Close")); 
			AddItem(nIndex,4,_T(" ")); 
		} 
		AddItem(nIndex++,3,_itoa(pNode->nAttempts,temp,10)); 
	} 
} 
 
void CPortScanDlg::OnButtonStop()  
{ 
	m_nCounter = m_maxPort+1; 
	m_cBtnStop.EnableWindow(FALSE); 
	m_cBtnScan.EnableWindow(); 
	m_static.SetWindowText((CString)_T("Ready")); 
}