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