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

📄 searchsite.cpp

📁 用Visual C++开发的一个FTP搜索工具。具有站点搜索、文件列表下载、文件搜索等功能
💻 CPP
字号:
// SearchSite.cpp : implementation file
//

#include "stdafx.h"
#include "IntelligentFtp.h"
#include "SearchSite.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSearchSite dialog
BOOL IsServerActive = FALSE;
CSocket * pSocket = NULL;

CSearchSite::CSearchSite(CWnd* pParent /*=NULL*/)
	: CDialog(CSearchSite::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSearchSite)
	m_IsSaveToDb = FALSE;
	//}}AFX_DATA_INIT
}

void CSearchSite::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSearchSite)
	DDX_Control(pDX, IDC_SITELIST, m_listSite);
	DDX_Control(pDX, IDC_MESSAGE, m_wndMessage);
	DDX_Control(pDX, IDC_IPADDRESS_TO, m_addrTo);
	DDX_Control(pDX, IDC_IPADDRESS_FROM, m_addrFrom);
	DDX_Check(pDX, IDC_ISSAVETODB, m_IsSaveToDb);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CSearchSite, CDialog)
	//{{AFX_MSG_MAP(CSearchSite)
	ON_BN_CLICKED(IDC_DIRECTSEARCH, OnDirectSearch)
	ON_NOTIFY(IPN_FIELDCHANGED, IDC_IPADDRESS_FROM, OnFieldchangedIpaddressFrom)
	ON_NOTIFY(IPN_FIELDCHANGED, IDC_IPADDRESS_TO, OnFieldchangedIpaddressTo)
	ON_BN_CLICKED(IDC_HISTORYDATA, OnHistorydata)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSearchSite message handlers

BOOL CSearchSite::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_addrFrom.SetAddress(59,64,7,1);
	m_addrTo.SetAddress(59,64,7,254);

	m_addrFrom.SetFieldRange(0,1,254);
	m_addrFrom.SetFieldRange(1,1,254);
	m_addrFrom.SetFieldRange(2,1,254);
	m_addrFrom.SetFieldRange(3,1,254);

	m_addrTo.SetFieldRange(0,1,254);
	m_addrTo.SetFieldRange(1,1,254);
	m_addrTo.SetFieldRange(2,1,254);
	m_addrTo.SetFieldRange(3,1,254);

	m_listSite.InsertColumn(0,"更新时间",LVCFMT_LEFT,100);
	m_listSite.InsertColumn(0,"服务状态",LVCFMT_LEFT,100);
	m_listSite.InsertColumn(0,"主机状态",LVCFMT_LEFT,100);
	m_listSite.InsertColumn(0,"端口",LVCFMT_LEFT,50);
	m_listSite.InsertColumn(0,"站点",LVCFMT_LEFT,100);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CSearchSite::OnOK() 
{
	// TODO: Add extra validation here
	
	// CDialog::OnOK();
}

void CSearchSite::OnCancel() 
{
	// TODO: Add extra cleanup here
	
	// CDialog::OnCancel();
}

void CSearchSite::OnFieldchangedIpaddressFrom(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	BYTE field0,field1,field2,field3;
	BYTE field4,field5,field6,field7;

	m_addrFrom.GetAddress(field0,field1,field2,field3);
	m_addrTo.GetAddress(field4,field5,field6,field7);

	if(field7 >= field3) {
		m_addrTo.SetAddress(field0,field1,field2,field7);
	}
	else {
		m_addrTo.SetAddress(field0,field1,field2,254);
	}

	*pResult = 0;
}

void CSearchSite::OnFieldchangedIpaddressTo(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	BYTE field0,field1,field2,field3;
	BYTE field4,field5,field6,field7;

	m_addrFrom.GetAddress(field0,field1,field2,field3);
	m_addrTo.GetAddress(field4,field5,field6,field7);

	if(field7 >= field3) {
		m_addrFrom.SetAddress(field4,field5,field6,field3);
	}
	else {
		m_addrFrom.SetAddress(field4,field5,field6,1);
	}
	
	*pResult = 0;
}

void CSearchSite::OnDirectSearch() 
{
	UpdateData(TRUE);

	BYTE field0,field1,field2,field3;
	BYTE field4,field5,field6,field7;

	m_addrFrom.GetAddress(field0,field1,field2,field3);
	m_addrTo.GetAddress(field4,field5,field6,field7);

	CString strIPAddr;
	BOOL bIsHostActive  = FALSE;
	BOOL bIsServerActive= FALSE;

	m_listSite.DeleteAllItems();

	for(int i =field3; i <= field7; i++) {
		strIPAddr.Format("%d.%d.%d.%d",field0,field1,field2,i);
		m_wndMessage.SetWindowText(""+strIPAddr);

		if(CheckHostStatus(strIPAddr)) {
			bIsHostActive  = TRUE;
		}
		else {
			bIsHostActive  = FALSE;
		}

		PARAM * param = new PARAM;
		sprintf(param->ip,"%d.%d.%d.%d",field0,field1,field2,i);
		param->port = 21;

		IsServerActive = FALSE;
		//CWinThread * thread ;= AfxBeginThread(CheckServerStatus,param);

		Sleep(100);

		if(!IsServerActive) {
			//TerminateThread(thread->m_hThread,0);

			if(pSocket != NULL) {
				pSocket->Close();
				delete pSocket;
				pSocket = NULL;
			}
			bIsServerActive = FALSE;
		}
		else {	//FTP服务已开启
			bIsServerActive = TRUE;
		}

		//
		InsertItemToList(strIPAddr, 21, bIsHostActive, IsServerActive) ;

		if(m_IsSaveToDb) {
			SaveSiteToDb(strIPAddr, 21, bIsHostActive, IsServerActive);
		}
	}

	m_wndMessage.SetWindowText("Over");
}

BOOL CSearchSite::CheckHostStatus(CString &strIPAddr)
{
	char destip[20] ;
	sprintf(destip,"%s",strIPAddr.GetBuffer(strIPAddr.GetLength()));
	
	//定义变量
	SOCKET           m_hSocket;
	SOCKADDR_IN      m_addrDest;
	SOCKADDR_IN      m_addrFrom;
	char             *icmp_data;
    char             *recvbuf;
	USHORT           seq_no ;
	char             *lpdest;
	int              datasize;
	BOOL			 m_bRecordRout;
	int              timeout;
    int              recvicmpnum;
	int				 ret = 0;

	//初始化变量
	icmp_data     = NULL;
	seq_no        = 0;
	recvbuf       = NULL;
	m_bRecordRout = FALSE;
	lpdest        = NULL;
	datasize      = DEF_PACKET_SIZE;
	m_hSocket     = INVALID_SOCKET;
    recvicmpnum   = 0;

	//初始化套接字
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        return 0;
    }

	m_bRecordRout = FALSE;
	lpdest = destip;

    m_hSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

    if (m_hSocket == INVALID_SOCKET) 
    {
        return FALSE ;
    }

    //
   	timeout = 100;
	ret = setsockopt(m_hSocket, SOL_SOCKET, SO_RCVTIMEO, 
                (char*)&timeout, sizeof(timeout));

    if(ret == SOCKET_ERROR) 
    {
		if (m_hSocket != INVALID_SOCKET) {
			closesocket(m_hSocket);
		}
        return FALSE;
    }
    
    ret = setsockopt(m_hSocket, SOL_SOCKET, SO_SNDTIMEO, 
                (char*)&timeout, sizeof(timeout));

    if (ret == SOCKET_ERROR) 
    {
		if (m_hSocket != INVALID_SOCKET) {
			closesocket(m_hSocket);
		}
        return FALSE;
    }

    memset(&m_addrDest, 0, sizeof(m_addrDest));

	m_addrDest.sin_family = AF_INET;
    
	if ((m_addrDest.sin_addr.s_addr = inet_addr(lpdest)) == INADDR_NONE)
    {   
		if (m_hSocket != INVALID_SOCKET) {
			closesocket(m_hSocket);
		}
        return FALSE;
    }   

    // 
    // Create the ICMP packet
    // 
    datasize += sizeof(IcmpHeader);  

    icmp_data =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET);
    if (!icmp_data) 
    {
		if (m_hSocket != INVALID_SOCKET) {
			closesocket(m_hSocket);
		}
        return FALSE;
    }

    recvbuf   =(char*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET);
    if (!recvbuf) 
    {
		if (m_hSocket != INVALID_SOCKET) {
			closesocket(m_hSocket);
		}
        return FALSE;
    }

    memset(icmp_data,0,MAX_PACKET);

	//重要函数,填充ICMP包头
    FillICMPData(icmp_data,datasize);

    ((IcmpHeader*)icmp_data)->i_cksum = 0;
    ((IcmpHeader*)icmp_data)->timestamp = GetTickCount();
    ((IcmpHeader*)icmp_data)->i_seq = seq_no++;
    ((IcmpHeader*)icmp_data)->i_cksum = CheckSum((USHORT*)icmp_data, datasize);
		
	DWORD time=GetTickCount();
    ret = sendto(m_hSocket, icmp_data, datasize, 0, 
                     (struct sockaddr*)&m_addrDest, sizeof(m_addrDest));

    if (ret == SOCKET_ERROR)
    {
		if (m_hSocket != INVALID_SOCKET) {
			closesocket(m_hSocket);
		}
		HeapFree(GetProcessHeap(), 0, recvbuf  );
		HeapFree(GetProcessHeap(), 0, icmp_data);
		WSACleanup();

        return FALSE;
	}

	int fromlen = sizeof(m_addrFrom);
    time= GetTickCount();
	ret = recvfrom(m_hSocket, recvbuf, MAX_PACKET, 0, 
                (struct sockaddr*)&m_addrFrom, &fromlen);
        
	if (ret == SOCKET_ERROR)
    {
		if (m_hSocket != INVALID_SOCKET) {
			closesocket(m_hSocket);
		}
		HeapFree(GetProcessHeap(), 0, recvbuf  );
		HeapFree(GetProcessHeap(), 0, icmp_data);
		WSACleanup();

        return FALSE;
    }

	if (m_hSocket != INVALID_SOCKET) {
        closesocket(m_hSocket);
	}
    HeapFree(GetProcessHeap(), 0, recvbuf  );
    HeapFree(GetProcessHeap(), 0, icmp_data);
//    WSACleanup();

	return TRUE;
}

USHORT CSearchSite::CheckSum(USHORT *buffer, int size)
{
   unsigned long cksum=0;

    while (size > 1) 
    {
        cksum += *buffer++;
        size -= sizeof(USHORT);
    }
    if (size) 
    {
        cksum += *(UCHAR*)buffer;
    }
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16);

    return (USHORT)(~cksum);
}

void CSearchSite::FillICMPData(char *icmp_data, int datasize)
{
   IcmpHeader *icmp_hdr = NULL;
   char       *datapart = NULL;

   icmp_hdr = (IcmpHeader*)icmp_data;
   icmp_hdr->i_type = ICMP_ECHO;	// Request an ICMP echo
   icmp_hdr->i_code = 0;
   icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
   icmp_hdr->i_cksum = 0;
   icmp_hdr->i_seq = 0;
}

void CSearchSite::InsertItemToList(CString &strIP, UINT nPort, BOOL bHost, BOOL bServer)
{
	CString str;

	int i = m_listSite.InsertItem(0,strIP);

	str.Format("%d",nPort);
	m_listSite.SetItemText(i,1,str);

	if(bHost) {
		m_listSite.SetItemText(i,2,"开启");
	}
	else {
		m_listSite.SetItemText(i,2,"关闭");
	}

	if(bServer) {
		m_listSite.SetItemText(i,3,"开启");
	}
	else {
		m_listSite.SetItemText(i,3,"关闭");
	}

	m_listSite.SetItemText(i,4,CTime::GetCurrentTime().Format("%H:%M:%S"));

	m_listSite.UpdateWindow();

	//Invalidate();
}

UINT CSearchSite::CheckServerStatus(LPVOID param)
{
	PARAM * info = (PARAM*)param;

	pSocket = new CSocket;
	pSocket->Create();

	if(pSocket->Connect(info->ip,info->port)) {
		IsServerActive = TRUE;
	}

	pSocket->Close();
	delete pSocket;
	pSocket = NULL;

	return 0;
}

void CSearchSite::SaveSiteToDb(CString &strIP, UINT nPort, BOOL bHost, BOOL bServer)
{
	CDatabase *	p_Database = new CDatabase;
	p_Database->SetLoginTimeout(5);

	BOOL p_Status = FALSE;
	try
	{
		p_Status = p_Database->Open("ftpdb");
		if(p_Status)
			TRACE("\nDB opened successfully\n");
		else
			TRACE("\nOpen DSN failed.\n");
	}
	catch(CMemoryException* pEx)
	{
		pEx->ReportError();
	}
	catch(CDBException*	pDBEx)
	{
		pDBEx->ReportError();
		TRACE("RetCOde:%d strError:[%d] strState: [%d]\n",
			pDBEx->m_nRetCode,
			pDBEx->m_strError,
			pDBEx->m_strStateNativeOrigin);
	}

	if(!p_Status)
	{
		MessageBox("Open DSN Failed.");

		if(p_Database->IsOpen())	p_Database->Close();
		if(p_Database	!=	NULL)	delete	p_Database;

		return	;
	}

	CFtpSite *	p_Record	=	new	CFtpSite(p_Database);

	if(!p_Record->Open(AFX_DB_USE_DEFAULT_TYPE,(LPCTSTR)"Site"))
	{
		MessageBox("Open Table SiteData Failed.");

		if(p_Record->IsOpen())		p_Record->Close();
		if(p_Database->IsOpen())	p_Database->Close();

		delete	p_Record;
		delete	p_Database;

		return	;
	}

	p_Record->AddNew();

	p_Record->m_IP = strIP;
	p_Record->m_Port = nPort;
	p_Record->m_IsHostActive = bHost;
	p_Record->m_IsPortActive = bServer;
	p_Record->m_Time = CTime::GetCurrentTime();

	p_Record->Update();

	if(p_Record->IsOpen())		p_Record->Close();
	if(p_Database->IsOpen())	p_Database->Close();

	delete	p_Record;
	delete	p_Database;	
}

void CSearchSite::OnHistorydata() 
{
	CDatabase *	p_Database = new CDatabase;
	p_Database->SetLoginTimeout(5);

	BOOL p_Status = FALSE;
	try
	{
		p_Status = p_Database->Open("ftpdb");
		if(p_Status)
			TRACE("\nDB opened successfully\n");
		else
			TRACE("\nOpen DSN failed.\n");
	}
	catch(CMemoryException* pEx)
	{
		pEx->ReportError();
	}
	catch(CDBException*	pDBEx)
	{
		pDBEx->ReportError();
		TRACE("RetCOde:%d strError:[%d] strState: [%d]\n",
			pDBEx->m_nRetCode,
			pDBEx->m_strError,
			pDBEx->m_strStateNativeOrigin);
	}

	if(!p_Status)
	{
		MessageBox("Open DSN Failed.");

		if(p_Database->IsOpen())	p_Database->Close();
		if(p_Database	!=	NULL)	delete	p_Database;

		return	;
	}

	CFtpSite *	p_Record	=	new	CFtpSite(p_Database);

	if(!p_Record->Open(AFX_DB_USE_DEFAULT_TYPE,(LPCTSTR)"Site"))
	{
		MessageBox("Open Table SiteData Failed.");

		if(p_Record->IsOpen())		p_Record->Close();
		if(p_Database->IsOpen())	p_Database->Close();

		delete	p_Record;
		delete	p_Database;

		return	;
	}

	CString	str;
	if(!p_Record->IsBOF())
	{
		m_listSite.DeleteAllItems();

		while(!p_Record->IsEOF())
		{
			int i = m_listSite.InsertItem(0,p_Record->m_IP);

			str.Format("%d",p_Record->m_Port);
			m_listSite.SetItemText(i,1,str);

			if(p_Record->m_IsHostActive) {
				m_listSite.SetItemText(i,2,"开启");
			}
			else {
				m_listSite.SetItemText(i,2,"关闭");
			}

			if(p_Record->m_IsHostActive) {
				m_listSite.SetItemText(i,3,"开启");
			}
			else {
				m_listSite.SetItemText(i,3,"关闭");
			}
			m_listSite.SetItemText(i,4,p_Record->m_Time.Format("%H:%M:%S"));
			m_listSite.UpdateWindow();

			p_Record->MoveNext();
		}
	}

	if(p_Record->IsOpen())		p_Record->Close();
	if(p_Database->IsOpen())	p_Database->Close();

	delete	p_Record;
	delete	p_Database;	
}

⌨️ 快捷键说明

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