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

📄 testlisendlg.cpp

📁 这个是一个数据包捕获程序,希望对大家能有所帮助.
💻 CPP
字号:
// TestLisenDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestLisen.h"
#include "TestLisenDlg.h"

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

bool flag=true;
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);
CWinThread *pThread=NULL;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();
     
// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestLisenDlg dialog

CTestLisenDlg::CTestLisenDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestLisenDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestLisenDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CTestLisenDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestLisenDlg)
	DDX_Control(pDX, IDC_LIST1, m_NewList);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestLisenDlg, CDialog)
	//{{AFX_MSG_MAP(CTestLisenDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, OnListen)
	ON_BN_CLICKED(IDC_BUTTON2, OnStop)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestLisenDlg message handlers

BOOL CTestLisenDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTestLisenDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 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 CTestLisenDlg::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 CTestLisenDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CTestLisenDlg::OnListen() 
{
	
//	CButton* pBtn=(CButton *)GetDlgItem(IDC_BUTTON1);
//	int n=pBtn->GetCheck();
	m_HostIp=GetIp(); //得到本机IP
//	if(1==n) //开始监听
//	{
		if(CreateSock()!=0) //建立
		{
			AfxMessageBox("WinSock设置失败");
			DestroyWindow();
		}
		else
		{
//			b_IsRun=TRUE;
			pThread=AfxBeginThread(RecvIpPro,this);
		}
//		pBtn->SetWindowText("停止监听");
//	}
//	else //停止监听
//	{
//		b_IsRun=FALSE;

//		pBtn->SetWindowText("开始监听");
//	}
flag=true;

	
}

void CTestLisenDlg::OnStop() 
{
	if(pThread)
	{
		TerminateThread(pThread->m_hThread, 0);
		CloseHandle(pThread->m_hThread);
	}
	
	if(m_RawSock)
		closesocket(m_RawSock);
	flag=false;
}

UINT RecvIpPro(LPVOID lpParam)
{
	int err=0;
	int recvLen;
	CTestLisenDlg* pDlg=(CTestLisenDlg*)lpParam;
	char recvBuf[MAX_PACK_LEN]={0};

		recvLen=recv(pDlg->m_RawSock,recvBuf,MAX_PACK_LEN,0);//接受数据
	while(flag)
		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 CTestLisenDlg::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 CTestLisenDlg::CreateSock()
{
	int err;
	char name[10];
	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,10);
	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 CTestLisenDlg::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* CTestLisenDlg::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 CTestLisenDlg::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 CTestLisenDlg::ShowIpInfo(char *pData, int 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
		strncpy(szSourceIP,m_szSourceIP,16);

	if(strcmp(m_HostIp,m_szDestIP)==0)
	{
		strcat(szDestIP,"(本机)");
		strcat(szDestIP,m_szDestIP);
	}
	else
		strncpy(szDestIP,m_szDestIP,16);

	strncpy(szSourcePort,m_szSourcePort,5);
	strncpy(szDestPort,m_szDestPort,5);
	strncpy(szDestIPt,m_szSourceIP,32);
	strncpy(szSourceIPt,m_szDestIP,32);
	strncpy(szProto,m_szProtocol,16);

	wsprintf(szWprot,"%d",GetDlgItemInt(IDC_EDIT1));
	GetDlgItem(IDC_EDIT2)->GetWindowText(szIP,32);
	
	BOOL bProt=1;
//		m_IsAllPort|(strcmp(szSourcePort,szWprot)==0)|
//		(strcmp(szDestPort,szWprot)==0); //判断端口规则
	BOOL bIp=1;
//		m_IsAllIp|(strcmp(szSourceIPt,szIP)==0)|
//		(strcmp(szDestIPt,szIP)==0); //判断IP规则
	BOOL bProto=1;
//		m_IsAllProto|(strcmp(szProto,m_szProto)==0); //判断协议规则
	
	if(bProt&&bIp&&bProto)
	{
			CString sNowTime=GetNowTime();
			str.Format("[%s] %s:%s->%s:%s 包大小(头/总)%d/%d %s",m_szProtocol,szSourceIP,
				m_szSourcePort,szDestIP,m_szDestPort,m_ihLen,len,
				sNowTime.GetBuffer(sNowTime.GetLength()));
			int nCount=((CListBox*)GetDlgItem(IDC_LIST1))->GetCount();
			if (nCount>=1000)
//				DelListBuf();
			//显示
			((CListBox*)GetDlgItem(IDC_LIST1))->AddString(str);
			//绑定数据
			IPDATA* pIpData = new IPDATA;
			pIpData->len = len;
			pIpData->buf = new char[len];
			memcpy(pIpData->buf, pData, len);
		
			((CListBox*)GetDlgItem(IDC_LIST1))->SetItemData(nCount,(DWORD)pIpData);
			((CListBox*)GetDlgItem(IDC_LIST1))->SetCaretIndex(nCount);
//			int nCheck=((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck();
//			if(nCheck)
				CreateLogFile(str.GetBuffer(0));
}
}

⌨️ 快捷键说明

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