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

📄 tcpscanpage.cpp

📁 VC网络程序设计实例导航配套代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*
	TcpScanPage.cpp
	Luca Piergentili, 14/07/99
	lpiergentili@yahoo.com
	http://www.geocities.com/lpiergentili/
*/
#include "env.h"
#include "pragma.h"
#include <limits.h>
#include "window.h"
#include "win32api.h"
#include "CAsyncSock.h"
#include "CListCtrlEx.h"
#include "CPropertyPageDialog.h"
#include "TcpMessages.h"
#include "TcpScanConfig.h"
#include "TcpScanAddServiceDlg.h"
#include "TcpServicesPage.h"
#include "TcpScanPage.h"
#include "TcpScanVersion.h"
#include "resource.h"

static void AFXAPI DDV_ValidateIP(CDataExchange*,int,CString&);
static void AFXAPI DDV_ValidatePortList(CDataExchange*,int,CString&);
static void AFXAPI DDV_ValidatePortNumber(CDataExchange*,int,UINT&);

IMPLEMENT_DYNCREATE(CScanPage,CPropertyPageDialog)

BEGIN_MESSAGE_MAP(CScanPage,CPropertyPageDialog)
	// menu popup
	ON_COMMAND(IDM_SCAN_REMOVEPORT,OnScanPopupMenuRemovePort)
	ON_COMMAND(IDM_SCAN_SAVETOREGISTRY,OnScanPopupMenuSaveToRegistry)
	ON_COMMAND(IDM_SCAN_LOADFROMREGISTRY,OnScanPopupMenuLoadFromRegistry)
	ON_COMMAND(IDM_SCAN_ADDTOSERVICES,OnScanPopupMenuAddToServices)
	ON_COMMAND(IDM_SCAN_REMOVEFROMSERVICES,OnScanPopupMenuRemoveFromServices)
	ON_COMMAND(IDM_SCAN_LOADSERVICES,OnScanPopupMenuLoadServices)
	ON_COMMAND(IDM_SCAN_LOADFROMSERVICES,OnScanPopupMenuLoadFromServices)
	ON_COMMAND(IDM_SCAN_CLEARPORTS,OnScanPopupMenuClearPorts)

	// radio buttons (lista/intervallo)
	ON_BN_CLICKED(IDC_RADIO_PORTLIST,OnRadioButtonPortList)
	ON_BN_CLICKED(IDC_RADIO_PORTRANGE,OnRadioButtonPortRange)

	// per impostare il default per l'host fine
	ON_EN_KILLFOCUS(IDC_EDIT_STARTHOST,OnKillFocusStartHost)

	// scan (inviato dal socket)
	ON_MESSAGE(WM_ASYNCCONNECT,OnScan)
END_MESSAGE_MAP()

/*
	DoDataExchange()
*/
void CScanPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);

	DDX_Text(pDX,IDC_EDIT_STARTHOST,m_strStartHost);
	DDX_Text(pDX,IDC_EDIT_ENDHOST,m_strEndHost);
	DDX_Text(pDX,IDC_EDIT_PORTLIST,m_strPortList);
	DDX_Radio(pDX,IDC_RADIO_PORTLIST,m_nPortList);
	//DDX_Radio(pDX,IDC_RADIO_PORTRANGE,m_nPortRange); se i radio buttons vengono raggruppati si chiama solo il DDX relativo al primo
	DDX_Text(pDX,IDC_EDIT_STARTPORT,m_nStartPort);
	DDX_Text(pDX,IDC_EDIT_ENDPORT,m_nEndPort);
	DDX_Control(pDX,IDC_LIST_SCAN,m_wndScanList);

	// effettua i controlli solo se deve effettivamente validare i dati
	// (click su IDOK/IDCANCEL e non il semplice spostamento da una pagina all'altra)
	if(pDX->m_bSaveAndValidate && !KillPage())
	{
		CWnd* pWnd;

		if((pWnd = GetDlgItem(IDC_EDIT_STARTHOST))!=NULL)
			if(pWnd->IsWindowEnabled())
				DDV_ValidateIP(pDX,IDC_EDIT_STARTHOST,m_strStartHost);

		if((pWnd = GetDlgItem(IDC_EDIT_ENDHOST))!=NULL)
			if(pWnd->IsWindowEnabled())
				DDV_ValidateIP(pDX,IDC_EDIT_ENDHOST,m_strEndHost);

		if((pWnd = GetDlgItem(IDC_EDIT_PORTLIST))!=NULL)
			if(pWnd->IsWindowEnabled())
				DDV_ValidatePortList(pDX,IDC_EDIT_PORTLIST,m_strPortList);

		if((pWnd = GetDlgItem(IDC_EDIT_STARTPORT))!=NULL)
			if(pWnd->IsWindowEnabled())
				DDV_ValidatePortNumber(pDX,IDC_EDIT_STARTPORT,m_nStartPort);

		if((pWnd = GetDlgItem(IDC_EDIT_ENDPORT))!=NULL)
			if(pWnd->IsWindowEnabled())
				DDV_ValidatePortNumber(pDX,IDC_EDIT_ENDPORT,m_nEndPort);
	}
}

/*
	CScanPage()
*/
CScanPage::CScanPage() : CPropertyPageDialog(IDD_PAGE_SCAN)
{
	m_pConfig = NULL;
	m_pAsyncSock = new CAsyncSock(this);
	m_strStartHost = DEFAULT_HOST;
	m_strEndHost = DEFAULT_HOST;
	m_nPortFlag = 0;
	m_nPortList = 0;
	m_nPortRange = 1;
	m_strPortList = DEFAULT_PORTNUMBERS;
	m_nStartPort = 0;
	m_nEndPort = 0;

	SetPropertyPageOkButton("&Scan");
}

/*
	~CScanPage()
*/
CScanPage::~CScanPage()
{
	if(m_pAsyncSock)
		delete m_pAsyncSock,m_pAsyncSock = NULL;
}

/*
	OnInitDialog()

	Inizializzazione del dialogo.
	Rimappa la funzione base per impostare i numeri delle porte (in base al meccanismo di controllo 
	effettuato tramite UpdateData(), DDX, DDV e OnKillPage() deve impostare i valori a mano).
*/
BOOL CScanPage::OnInitDialog(void)
{
	// deve chiamare il gestore originale
	CPropertyPageDialog::OnInitDialog();

	// imposta i defaults per i campi numerici (per i campi stringa non serve)
	// (non puo' chiamare UpdateData() ma deve impostare a mano, vedi sopra)
	CWnd* pWnd;
	if((pWnd = GetDlgItem(IDC_EDIT_STARTPORT))!=NULL)
		pWnd->SetWindowText("0");
	if((pWnd = GetDlgItem(IDC_EDIT_ENDPORT))!=NULL)
		pWnd->SetWindowText("0");

	// crea il controllo per la lista per lo scanning
	CreateScanningList();
	
	return(FALSE);
}

/*
	OnSetActive()

	Attivazione della pagina.
	Rimappa la funzione base per cambiare il testo del bottone IDOK dello sheet.
*/
BOOL CScanPage::OnSetActive(void)
{
	// deve chiamare il gestore originale
	CPropertyPageDialog::OnSetActive();
	
	// modifica il testo del bottone IDOK dello sheet
	SetPropertySheetOkButton(GetPropertyPageOkButton());

	// disabilita il bottone IDOK se una qualsiasi delle pagine rimanenti e' attiva
	if(LookForBusyPages(IDD_PAGE_SCAN))
		DisablePropertySheetOkButton();

	return(TRUE);
}

/*
	OnKillActive()

	Disattivazione della pagina.
*/
BOOL CScanPage::OnKillActive(void)
{
	// deve chiamare il gestore originale
	CPropertyPageDialog::OnKillActive();

	UpdateData(TRUE);

	return(TRUE);
}

/*
	OnKillSheet()

	Chiusura del dialogo.
	Rimappa la funzione base per salvare la configurazione.
*/
void CScanPage::OnKillSheet(void)
{
	// si invia il messaggio per terminare lo scanning
	::SendMessage(this->m_hWnd,WM_ASYNCCONNECT,WM_CLOSE,WM_CLOSE);

	if(IsWindow(this->m_hWnd))
	{
		// aggiorna la configurazione prima di uscire
		// UpdateData(TRUE) non serve perche' non fa riferimento a un campo ma alla lista
		m_pConfig->UpdateNumber(TCPSCAN_OPTIONS_KEY,TCPSCAN_SCAN_HOST_COLSIZE_KEY,m_wndScanList.GetColWidth(0));
		m_pConfig->UpdateNumber(TCPSCAN_OPTIONS_KEY,TCPSCAN_SCAN_PORT_COLSIZE_KEY,m_wndScanList.GetColWidth(1));
		m_pConfig->UpdateNumber(TCPSCAN_OPTIONS_KEY,TCPSCAN_SCAN_DESC_COLSIZE_KEY,m_wndScanList.GetColWidth(2));
	}
}

/*
	OnOk()

	Chiamata dallo sheet per il click sul bottone (IDOK).
*/
void CScanPage::OnOk(void)
{
	// si imposta come pagina attiva
	EnterPageBusyState(IDD_PAGE_SCAN);

	// crea il socket per lo scanning
	if(!m_pAsyncSock)
		m_pAsyncSock = new CAsyncSock(this);

	// si invia il messaggio per iniziare lo scanning
	::PostMessage(this->m_hWnd,WM_ASYNCCONNECT,(WPARAM)-1,MAKELPARAM((WORD)-1,(WORD)-1));
}

/*
	OnCancel()

	Chiamata dallo sheet per il click sul bottone (IDCANCEL).
*/
void CScanPage::OnCancel(void)
{
	// si invia il messaggio per terminare lo scanning
	::PostMessage(this->m_hWnd,WM_ASYNCCONNECT,WM_CANCEL,WM_CANCEL);

	// resetta lo status
	LeavePageBusyState(IDD_PAGE_SCAN);
}

/*
	OnRadioButtonPortList()

	Abilita il campo lista e disabilita i campi intervallo.
*/
void CScanPage::OnRadioButtonPortList(void)
{
	char szPort[16];

	GetDlgItem(IDC_EDIT_PORTLIST)->EnableWindow(TRUE);
	
	if(GetDlgItem(IDC_EDIT_STARTPORT)->GetWindowText(szPort,sizeof(szPort)-1) <= 0)
		GetDlgItem(IDC_EDIT_STARTPORT)->SetWindowText("1");
	GetDlgItem(IDC_EDIT_STARTPORT)->EnableWindow(FALSE);
	
	if(GetDlgItem(IDC_EDIT_ENDPORT)->GetWindowText(szPort,sizeof(szPort)-1) <= 0)
		GetDlgItem(IDC_EDIT_ENDPORT)->SetWindowText("1");
	GetDlgItem(IDC_EDIT_ENDPORT)->EnableWindow(FALSE);

	m_nPortFlag = 0;
}

/*
	OnRadioButtonPortRange()

	Abilita i campi intervallo e disabilita il campo lista.
*/
void CScanPage::OnRadioButtonPortRange(void)
{
	char szPort[16];

	if(GetDlgItem(IDC_EDIT_ENDPORT)->GetWindowText(szPort,sizeof(szPort)-1) <= 0)
		GetDlgItem(IDC_EDIT_PORTLIST)->SetWindowText("1");
	GetDlgItem(IDC_EDIT_PORTLIST)->EnableWindow(FALSE);
	
	GetDlgItem(IDC_EDIT_STARTPORT)->EnableWindow(TRUE);
	GetDlgItem(IDC_EDIT_ENDPORT)->EnableWindow(TRUE);

	m_nPortFlag = 1;
}

/*
	OnKillFocusStartHost()

	Imposta il default per l'host fine.
*/
void CScanPage::OnKillFocusStartHost(void)
{
	CString strIP;

	// imposta l'host finale sull'iniziale solo se il primo e' vuoto
	if(GetDlgItemText(IDC_EDIT_ENDHOST,strIP)==0)
		if(GetDlgItemText(IDC_EDIT_STARTHOST,strIP)!=0)
			SetDlgItemText(IDC_EDIT_ENDHOST,strIP);
}

/*
	OnScanPopupMenuRemovePort()

	Elimina l'elemento selezionato dalla lista per lo scanning.
*/
void CScanPage::OnScanPopupMenuRemovePort(void)
{
	RemovePort();
}

/*
	OnScanPopupMenuSaveToRegistry()

	Salva la lista per lo scanning nel registro.
*/
void CScanPage::OnScanPopupMenuSaveToRegistry(void)
{
	if(SaveScanning())
		AfxMessageBox("The current scanning has been saved into the registry.",MB_ICONINFORMATION);
}

/*
	OnScanPopupMenuLoadFromRegistry()

	Carica la lista per lo scanning dal registro.
*/
void CScanPage::OnScanPopupMenuLoadFromRegistry(void)
{
	if(!LoadScanning())
		AfxMessageBox("Unable to load the scanning list from the registry.",MB_ICONWARNING);
}

/*
	OnScanPopupMenuAddToServices()

	Aggiunge la porta alla lista dei servizi.
*/
void CScanPage::OnScanPopupMenuAddToServices(void)
{
	int nItem = 0;
	BOOL bAdd = TRUE;

	if((nItem = m_wndScanList.GetCurrentItem()) >= 0)
	{
		bAdd = FALSE;

		// ricava i puntatori (classe e lista) per accedere alla pagina dei servizi
		CServicesPage* pServicesPage = NULL;
		CListCtrlEx* pServicesList = NULL;
		PROPERTYPAGE* p;
		if((p = FindPage(IDD_PAGE_SERVICES))!=(PROPERTYPAGE*)NULL)
		{
			pServicesPage = (CServicesPage*)p->page;
			pServicesList = &(pServicesPage->m_wndServicesList);
		}

		// e' riuscito ad ottenere il puntatore alla pagina dei servizi
		if(pServicesPage)
		{
			// imposta i campi per il servizio
			char szService[SERVICE_NAME+1] = {0};
			char szPort[PORT_NAME+1] = {0};

			m_wndScanList.GetItemText(nItem,2,szService,sizeof(szService)-1);
			m_wndScanList.GetItemText(nItem,1,szPort,sizeof(szPort)-1);

			CString strServiceName = szService;
			UINT nPortNumber = atoi(szPort);
			CString strProtoName = "tcp";
			CString strComment = " ";

			// dialogo per il servizio
			CTcpScanAddServiceDlg dlg(this,strServiceName,nPortNumber,strProtoName,strComment);
			if(dlg.DoModal()==IDOK)
			{
				// fa in modo che venga chiamato il codice di inizializzazione della pagina se 
				// questa non e' stata ancora visualizzata
				if(!pServicesPage->Dirty())
					ActivatePage(IDD_PAGE_SERVICES);

				// aggiunge il servizio alla lista
				SERVICES s(strServiceName,nPortNumber,strProtoName,strComment);
				bAdd = pServicesPage->AddService(&s);
			}
			else
				bAdd = TRUE;
		}
	}
	
	if(!bAdd)
		AfxMessageBox("Unable to add the service to the list.",MB_ICONWARNING);
}

/*
	OnScanPopupMenuRemoveFromServices()

	Rimuove la porta dalla lista dei servizi.
*/
void CScanPage::OnScanPopupMenuRemoveFromServices(void)
{
	int nItem = 0;
	BOOL bFound = TRUE;

	if((nItem = m_wndScanList.GetCurrentItem()) >= 0)
	{
		bFound = FALSE;

		// ricava i puntatori (classe e lista) per accedere alla pagina dei servizi
		CServicesPage* pServicesPage = NULL;
		CListCtrlEx* pServicesList = NULL;
		PROPERTYPAGE* p;
		if((p = FindPage(IDD_PAGE_SERVICES))!=(PROPERTYPAGE*)NULL)
		{
			pServicesPage = (CServicesPage*)p->page;
			pServicesList = &(pServicesPage->m_wndServicesList);
		}

		// e' riuscito ad ottenere il puntatore alla pagina dei servizi
		if(pServicesPage)
		{
			// imposta i campi per il servizio
			char szService[SERVICE_NAME+1] = {0};
			char szPort[PORT_NAME+1] = {0};

			m_wndScanList.GetItemText(nItem,2,szService,sizeof(szService)-1);
			m_wndScanList.GetItemText(nItem,1,szPort,sizeof(szPort)-1);

			// fa in modo che venga chiamato il codice di inizializzazione della pagina se 
			// questa non e' stata ancora visualizzata
			if(!pServicesPage->Dirty())
				ActivatePage(IDD_PAGE_SERVICES);

			// elimina il servizio alla lista
			SERVICES s(szService,atoi(szPort),"tcp"," ");
			bFound = pServicesPage->RemoveService(&s);
		}
	}
	
	if(!bFound)
		AfxMessageBox("There is no a such service into the list.",MB_ICONWARNING);
}

/*
	OnScanPopupMenuLoadServices()

	Carica la lista dei servizi con le porte presenti nella lista per lo scanning.
*/
void CScanPage::OnScanPopupMenuLoadServices(void)
{
	BOOL bLoad = TRUE;

	// ricava i puntatori (classe e lista) per accedere alla pagina dei servizi
	CServicesPage* pServicesPage = NULL;
	CListCtrlEx* pServicesList = NULL;
	PROPERTYPAGE* p;
	if((p = FindPage(IDD_PAGE_SERVICES))!=(PROPERTYPAGE*)NULL)
	{
		pServicesPage = (CServicesPage*)p->page;
		pServicesList = &(pServicesPage->m_wndServicesList);
	}

	// e' riuscito ad ottenere il puntatore alla pagina dei servizi
	if(pServicesPage)
	{
		bLoad = FALSE;

		// fa in modo che venga chiamato il codice di inizializzazione della pagina se 
		// questa non e' stata ancora visualizzata
		if(!pServicesPage->Dirty())
			ActivatePage(IDD_PAGE_SERVICES);

		// elimina tutti gli elementi dalla lista dei servizi
		pServicesList->DeleteAllItems();

		// copia gli elementi presenti nella lista per lo scanning in quella per i servizi
		SERVICES s;
		char szService[SERVICE_NAME+1] = {0};
		char szPort[PORT_NAME+1] = {0};

		// per ogni elemento presente nelle lista per lo scanning
		int tot = m_wndScanList.GetItemCount();
		for(int i = 0; i < tot; i++)
		{
			// imposta i campi per il servizio
			m_wndScanList.GetItemText(i,2,szService,sizeof(szService)-1);
			m_wndScanList.GetItemText(i,1,szPort,sizeof(szPort)-1);

			strcpyn(s.service,szService,SERVICE_NAME+1);
			s.port = atoi(szPort);
			strcpy(s.proto,"tcp");
			strcpy(s.comment," ");

			// aggiuge il servizio alla lista
			pServicesPage->AddService(&s);
		}

		bLoad = TRUE;
	}
		
	if(bLoad)
		AfxMessageBox("The current scanning has been loaded into the services list.",MB_ICONINFORMATION);
	else
		AfxMessageBox("Unable to load current scanning into the services list.",MB_ICONWARNING);
}

/*
	OnScanPopupMenuLoadFromServices()

	Carica la lista per lo scanning con le porte presenti nella lista dei servizi.
*/
void CScanPage::OnScanPopupMenuLoadFromServices(void)
{

⌨️ 快捷键说明

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