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

📄 listendlg.cpp

📁 毕业设计——本程序用于网络检测——监听的一种代码。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// listenDlg.cpp : implementation file
//

#include "stdafx.h"
#include "listen.h"
#include "listenDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CListenDlg dialog

BOOL b_IsRun=FALSE;

UINT RecvIpPro(LPVOID lpParam);
char* GetIp();
CString GetNowTime();
BOOL CreateLogFile(char *strInfo,char *strFileName="log.txt");
BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,
						 WPARAM wParam,LPARAM lParam);

CListenDlg::CListenDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CListenDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CListenDlg)
	m_iWprot = 0;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_IsAllPort=TRUE;
	m_IsAllIp=TRUE;
	m_IsAllProto=TRUE;
	m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON2);
	m_myddlg.Create(IDD_DIALOG3);

}

void CListenDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CListenDlg)
	DDX_Control(pDX, IDC_LIST3, m_list);
	DDX_Text(pDX, IDC_EDIT1, m_iWprot);
	DDV_MinMaxInt(pDX, m_iWprot, 0, 10000);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CListenDlg, CDialog)
	//{{AFX_MSG_MAP(CListenDlg)
	ON_COMMAND(ID_START,Start)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
	ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
	ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
	ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
	ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
	ON_BN_CLICKED(IDC_RADIO5, OnRadio5)
	ON_BN_CLICKED(IDC_RADIO6, OnRadio6)
	ON_BN_CLICKED(IDC_RADIO7, OnRadio7)
	ON_BN_CLICKED(IDC_RADIO8, OnRadio8)
	ON_COMMAND(ID_COPY_SIP, OnCopySip)
	ON_COMMAND(ID_COPY_DIP, OnCopyDip)
	ON_WM_SYSCOMMAND()
	ON_WM_DESTROY()
	ON_NOTIFY(NM_CLICK, IDC_LIST3, OnClickList3)
	ON_NOTIFY(NM_RCLICK, IDC_LIST3, OnRclickList3)
	ON_COMMAND(IDMENU_QUIT, OnQuit)
	ON_COMMAND(ID_STOP, OnStop)
	ON_COMMAND(ID_MENUITEM32779, OnTop)
	ON_COMMAND(ID_SHOWMAINWINDOW, OnShowmainwindow)
	ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
	ON_WM_TIMER()
	ON_COMMAND(ID_MENU_TRANSPORT, OnMenuTransport)
	ON_BN_CLICKED(IDC_BUTTON_FLITER, OnButtonFliter)
	ON_COMMAND(ID_MENU_DIR, OnMenuDir)
	ON_MESSAGE(WM_MY_TRAY,OnTray)
	ON_COMMAND(IDR_MENU_QUIT, OnMenuQuit)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CListenDlg message handlers

BOOL CListenDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	CMenu MainMenu;
	if(!MainMenu.LoadMenu(IDR_MAINFRAME))
	{
		AfxMessageBox("Can't load main menu!",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;
	}
	SetMenu(&MainMenu);
//	m_hMainMenu=MainMenu.Detach();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	m_hIcon = AfxGetApp() ->LoadIcon(IDI_ICON2);
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	if(!InitSock())
		return FALSE;


	//设置CListCtrl控件的属性
	m_list.ModifyStyle(LVS_TYPEMASK,LVS_REPORT);
	m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_FLATSB
		|LVS_EX_TWOCLICKACTIVATE |LVS_EX_GRIDLINES);
	m_list.InsertColumn(0,"协议类型",LVCFMT_LEFT,60);
	m_list.InsertColumn(1,"源IP地址",LVCFMT_LEFT,120);
	m_list.InsertColumn(2,"源端口",LVCFMT_LEFT,60);

	m_list.InsertColumn(3,"目标IP地址",LVCFMT_LEFT,120);
	m_list.InsertColumn(4,"目标端口",LVCFMT_LEFT,60);

	m_list.InsertColumn(5,"包大小(头/总)",LVCFMT_LEFT,100);
	m_list.InsertColumn(6,"收到时间",LVCFMT_LEFT,140);

	m_list.SetBkColor(RGB(195,200,195));
	m_list.SetTextColor(RGB(0,0,255));


	//添加系统菜单
	CMenu *pMenu=GetSystemMenu(FALSE);
	AppendMenu(pMenu->m_hMenu,MF_SEPARATOR,0,NULL);
	AppendMenu(pMenu->m_hMenu,MF_STRING,IDM_SYSMENU,"关于...");

	//初始化控件
	((CButton *)GetDlgItem(IDC_RADIO2))->SetCheck(TRUE);
	((CButton *)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);
	((CButton *)GetDlgItem(IDC_RADIO5))->SetCheck(TRUE);

	//添加任务栏中的图标
	AddTaskIcon();
	//初始话状态栏
 	CTime time=CTime::GetCurrentTime();	
	CString m_strTime=time.Format("%X");	
	m_strTime="程序启动时间 "+m_strTime;
	 
	m_wndStatusBar.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM,  CRect(0,0,0,0),  this,  102);

	int strPartDim[4]= {150,300,-1};	     
	m_wndStatusBar.SetParts(3,strPartDim);

	m_wndStatusBar.SetText(m_strTime,0,0 );
	m_strTime = "监听开始时间00:00:00";
	m_wndStatusBar.SetText(m_strTime,1,0);
	time=CTime::GetCurrentTime();	
	m_strTime = time.Format("%X");
	m_strTime = "当前时间" +m_strTime;
	m_wndStatusBar.SetText(m_strTime,2,0);
	SetTimer(0,1000,NULL);

	//初始化临界区对象
	InitializeCriticalSection(&m_ls);
	//建立显示IP包窗口
	m_IpShowDlg.Create(IDD_IPDATA,this);
	m_IpShowDlg.ShowWindow(SW_SHOW);
	::SetWindowText(AfxGetApp()->m_pMainWnd->m_hWnd,"网络监听程序------毕业设计");
	CRect rect;
	GetClientRect(&rect);
//	ClientToScreen(&rect);
	m_IpShowDlg.MoveWindow(10,265,rect.right-20,100);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CListenDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CListenDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CListenDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	CButton* pBtn=(CButton *)GetDlgItem(IDC_BUTTON1);
	int n=pBtn->GetCheck();
	BeginOrStopListen(n);


}
//在线程冲中不断接受IP包
UINT RecvIpPro(LPVOID lpParam)
{
	int err=0;
	int recvLen;
	CListenDlg* pDlg=(CListenDlg*)lpParam;
	char recvBuf[MAX_PACK_LEN]={0};
	while(b_IsRun)
	{
		recvLen=recv(pDlg->m_RawSock,recvBuf,MAX_PACK_LEN,0);//接受数据
		
		if(err==SOCKET_ERROR)
		{
			if(WSAGetLastError()==WSAEWOULDBLOCK) //如果错误为阻塞那么将继续接受
				continue;
			break;
		}
		//处理已经接受到的IP包
		EnterCriticalSection(&pDlg->m_ls);
		pDlg->SplitIpPack(recvBuf,recvLen); //分解IP包
		pDlg->ShowIpInfo(recvBuf,recvLen); //显示数据
		LeaveCriticalSection(&pDlg->m_ls);
	}
	return 0;

}

//加载SOCK
BOOL CListenDlg::InitSock()
{
	WSADATA wsaData;
	int err;
	if((err=WSAStartup(MAKEWORD(2,2),&wsaData))!=0) //加载失败
		return FALSE;
	if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion) != 2) 
	{
		WSACleanup();//未能要求到所需的版本
		return FALSE;
	}
	return TRUE;
}

//建立原始套接字
int CListenDlg::CreateSock()
{
	int err;
	char name[30];
	hostent *pHostent;
	int port=8310;
	SOCKADDR_IN sockaddr;
	m_RawSock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
	if(m_RawSock==INVALID_SOCKET)
	{
		return WSAGetLastError(); //socket创建失败
	}
	
	err=gethostname(name,30);
	if(err==SOCKET_ERROR)
	{
		return WSAGetLastError(); //取本机用户名失败
	}

	pHostent=gethostbyname (name);

	sockaddr.sin_family=AF_INET;
	sockaddr.sin_port=htons(port);
	memcpy(&sockaddr.sin_addr.s_addr,pHostent->h_addr_list[0],
		pHostent->h_length);

	//free(pHostent);
	
	err=bind(m_RawSock,(SOCKADDR *)&sockaddr,sizeof(sockaddr));//绑定
	if(err==SOCKET_ERROR)
	{
		return WSAGetLastError(); //取本机用户名失败
	}
	BOOL bOptval=TRUE;

	//设置套节字选项
	setsockopt(m_RawSock,SOL_SOCKET,SO_REUSEADDR,(char*)&bOptval,sizeof(bOptval));
	err=setsockopt(m_RawSock,IPPROTO_IP,IP_HDRINCL,(char*)&bOptval, //IP_HDRINCL该选项使之能操作IP头
		sizeof(bOptval));
	if(err==SOCKET_ERROR)
	{
		return WSAGetLastError(); //设置套节字选项失败
	}

	//把网卡置于混杂模式。获取IO操作的相关信息
	DWORD dwBufferLen[10] ;
	DWORD dwBufferInLen = 1 ;
	DWORD dwBytesReturned = 0 ;
	err=WSAIoctl (
		m_RawSock,                                               
		SIO_RCVALL,       //设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包                           
		&dwBufferInLen,                                     
		sizeof(dwBufferInLen),                                       
		&dwBufferLen,                                    
		sizeof(dwBufferLen),                                      
		&dwBytesReturned,                              
		NULL,                           
		NULL  
		);//最后两参数设置非阻塞


	if(err==SOCKET_ERROR)
	{
		return WSAGetLastError(); //设置套节字选项失败
	}
	return 0;
}

//分解IP包
void CListenDlg::SplitIpPack(char *pData, int len)
{
	IP_HEADER* pIpHead;
	pIpHead=(IP_HEADER*)pData; //转为IP头结构
	SOCKADDR_IN saSource,saDest; //中间变量分别为源IP地址结构和目标IP地址结构 

	//得到包中协议
	int iProtocol;
	iProtocol=pIpHead->proto;
	//得到协议字符形式表示m_szProtocol
	strncpy(m_szProtocol,CheckProtocol(iProtocol),MAX_PROTO_TEXT_LEN);


	//得到源IP
	saSource.sin_addr.s_addr=pIpHead->sourceIP;
	strncpy(m_szSourceIP,inet_ntoa(saSource.sin_addr),MAX_ADDR_LEN);

	//得到目标IP
	saDest.sin_addr.s_addr=pIpHead->destIP;
	strncpy(m_szDestIP,inet_ntoa(saDest.sin_addr),MAX_ADDR_LEN);

	//得到TTL
	int ttl;
	ttl=pIpHead->ttl;
	wsprintf(m_szTTL,"%d",ttl);

	//得到头长度
	int ihLen=sizeof(unsigned long) * (pIpHead->h_lenver & 0xf); // * 表示乘法

	m_ihLen=ihLen;
	unsigned short srcPort=0,destPort=0;
	switch(iProtocol) {
	case IPPROTO_TCP:
		TCP_HEADER* pTcpHead;
		pTcpHead=(TCP_HEADER*)(pData+ihLen);
		srcPort=ntohs(pTcpHead->th_sport);
		destPort=ntohs(pTcpHead->th_dport);
		wsprintf(m_szSourcePort,"%d",srcPort);
		wsprintf(m_szDestPort,"%d",destPort);
		break;
	case IPPROTO_UDP:
		UDP_HEADER* pUdpHead;
		pUdpHead=(UDP_HEADER*)(pData+ihLen);
		srcPort=ntohs(pUdpHead->uh_sport);
		destPort=ntohs(pUdpHead->uh_dport);	
		wsprintf(m_szSourcePort,"%d",srcPort);
		wsprintf(m_szDestPort,"%d",destPort);
		break;
	case IPPROTO_ICMP:
		ICMP_HEADER* pIcmpHead;
		pIcmpHead=(ICMP_HEADER*)(pData+ihLen);
		wsprintf(m_szSourcePort,"%s","");
 		wsprintf(m_szDestPort,"%s","");
		break;
	default:
		wsprintf(m_szSourcePort,"%s","");
		wsprintf(m_szDestPort,"%s","");
	}
		
}

//将协议int转为字符串
char* CListenDlg::CheckProtocol(int iProtocol)
{
	for(int i=0; i<MAX_PROTO_NUM; i++)
	{
		if(ProtoMap[i].ProtoNum==iProtocol)
		{
			return ProtoMap[i].ProtoText;
		}
	}
		return "";
}

//得到本机IP
char* GetIp()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	char name[255];
	char *ip;
	PHOSTENT hostinfo;
	wVersionRequested = MAKEWORD( 2, 0 );
	if ( WSAStartup( wVersionRequested, &wsaData ) == 0 )
	{
		
		if( gethostname ( name, sizeof(name)) == 0)
		{
			if((hostinfo = gethostbyname(name)) != NULL)
			{
				ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
			}
		}
		
		WSACleanup( );
	} 
	return ip;
}

//得到当前时间
CString GetNowTime()
{
	CTime time;
	CString str;
	time = CTime::GetCurrentTime();	
	str = time.Format("%Y-%m-%d %H:%M:%S");
	return str;
}

//写入文件
BOOL CreateLogFile(char *strInfo,char *strFileName)
{
	if (lstrlen(strInfo)<1)
		return FALSE;
	CFile file;
	file.Open(strFileName,CFile::modeCreate|CFile::modeReadWrite|CFile::modeNoTruncate/*modeWrite|CFile::modeRead)*/);//CFile::modeNoTruncate为不截去以前的数据,追加新数据
	file.SeekToEnd();
	CString temp;
	char *pStrInfo;
	temp=strInfo;
	temp=temp+"\r\n";
	pStrInfo=temp.GetBuffer(temp.GetLength());
	file.Write(pStrInfo,::lstrlen(pStrInfo));
	file.Close();
	return TRUE;
}

//复制到剪贴板
BOOL CListenDlg::SetClipboard(char* pData)
{
//	pData="12345";
	if(::lstrlen(pData)<1)
		return FALSE;
	if(!::OpenClipboard(m_hWnd))
		return FALSE;
	::EmptyClipboard();
	HANDLE hData=::GlobalAlloc(GHND|GMEM_SHARE,::lstrlen(pData)+1); //申请全局内存
	char* pToData=(char*)::GlobalLock(hData); //得到该内存的指针,锁定改内存
	::lstrcpy(pToData,pData); //将该字符串复制给该内存
	::GlobalUnlock(hData); //解锁
	::SetClipboardData(CF_TEXT,hData);
	::CloseClipboard();
	return TRUE;
}
void CListenDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	m_list.DeleteAllItems(); //列表框清空

}

//将IP记录显示到ListCtrl
void CListenDlg::ShowIpInfo(char *pData, int len)//len表示接受到的数据包的长度
{
	if(len<0)
		return;
	CString str;
	char szSourceIP[32]={0};
	char szDestIP[32]={0};

	char szSourcePort[16]={0}; //截取到的源端口
	char szDestPort[16]={0}; //截取到的目标端口

	char szSourceIPt[32]={0}; //截取到源IP
	char szDestIPt[32]={0}; //截取到目标IP
	
	char szWprot[5]={0}; //取得输入端口
	char szIP[32]={0}; //取得输入IP
	char szProto[16]={0}; //取得输入协议
	


	if(strcmp(m_HostIp,m_szSourceIP)==0)
	{
		strcat(szSourceIP,"(本机)");
		strcat(szSourceIP,m_szSourceIP);
	}
	else

⌨️ 快捷键说明

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