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

📄 probemail.cpp

📁 一个网络监视的程序
💻 CPP
字号:
// ProbeMail.cpp: implementation of the ProbeMail class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "CCAMSC.h"
#include "ProbeMail.h"
#include "global.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

ProbeMail::ProbeMail()
{
	
}
//*******************************************************************************
//函 数 名:check
//功    能:将邮件链表中的信息提取并写入发送缓冲区,并删除此节点
//输入参数:无
//输出参数:无
//编写日期:2004.07.19
//修改日期:
//作    者:杨光
//其他说明:
//********************************************************************************
ProbeMail::CheckMail()
{
	EnterCriticalSection(&gCriticalSectionMailList);
	//	FileProbe fileprobe;


	std::string l_mailstr;//保存mail事件信息字符串
	Mail *curr, *precurr;
	
	precurr = Header_out;
	curr = Header_out->next;
	while(curr != NULL)
	{
		if(curr->finish == 1)
		{
			CTime t_SystemTime;
			CString t_CStringTime;
			t_SystemTime= CTime::GetCurrentTime();
			l_mailstr+=t_SystemTime.Format(_T("%H:%M:%S"));
			
			l_mailstr = l_mailstr + " MAIL "+  curr->subject + " " +
				curr->from + " " +
				curr->to + " " +
				curr->attachment + "\n";
			precurr->next = curr->next;
			delete(curr);
			curr = precurr->next;
		}
		else
		{
			precurr = curr;
			curr = curr->next;
		}
	}
	
	precurr = Header_in;
	curr = Header_in->next;
	while(curr != NULL)
	{
		if(curr->finish == 1)
		{
			CTime t_SystemTime;
			CString t_CStringTime;
			t_SystemTime= CTime::GetCurrentTime();
			l_mailstr+=t_SystemTime.Format(_T("%H:%M:%S"));
			
			l_mailstr = l_mailstr + " MAIL "+ curr->subject + " " +
				curr->from + " " +
				curr->to + " " +
				curr->attachment + "\n";
			precurr->next = curr->next;
			delete(curr);
			curr = precurr->next;
		}
		else
		{
			precurr = curr;
			curr = curr->next;
		}
	}
	
	LeaveCriticalSection(&gCriticalSectionMailList);




	if (l_mailstr.size()>=1) {

	
	EnterCriticalSection(&gCriticalSectionForPrtBuff);
	
	(PtrBuffWrite->str)+=l_mailstr;
	(PtrBuffWrite->len)+=l_mailstr.size();

	l_mailstr.erase();
	LeaveCriticalSection(&gCriticalSectionForPrtBuff);
	}
	
}
//*******************************************************************************
//函 数 名:StartProbe
//功    能:开始数据包捕获
//输入参数:用户选择的网络设备的选号
//输出参数:状态信息
//编写日期:2004.07.19
//修改日期:2004.07.20
//作    者:杨光
//其他说明:
//********************************************************************************
ProbeMail::	StartProbe(int devselect)
{
		
		pcap_if_t *d = alldevs;
		pcap_t * adhandle;
		char errbuf[PCAP_ERRBUF_SIZE];
		u_int netmask;
		char packet_filter[] = "ip and tcp";
		struct bpf_program fcode;
		int i = 0;
		
		//跳转到已选择的网络适配器
		for(d = alldevs; i < devselect; d = d->next, i++);
		//打开设备
		if((adhandle = pcap_open_live(d->name, 65536, 0, 1000, errbuf)) == NULL)
		{
			fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n");
			pcap_freealldevs(alldevs);
			return -1;
		}
		//过滤
		if(pcap_datalink(adhandle) != DLT_EN10MB)
		{
			fprintf(stderr, "\nThis program works only on Ethernet networks.\n");
			pcap_freealldevs(alldevs);
			return -1;
		}
		if(d->addresses != NULL)
			netmask = ((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
		else
			netmask = 0xffffff;
		if(pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) < 0)
		{
			fprintf(stderr, "\nUnable to compile the packet filter. Check the syntax.\n");
			pcap_freealldevs(alldevs);
			return -1;
		}
		if(pcap_setfilter(adhandle, &fcode) < 0)
		{
			fprintf(stderr, "\nError setting the filter.\n");
			pcap_freealldevs(alldevs);
			return -1;
		}
		
	//	printf("\nlistening on %s...\n", d->description);
		
		//释放设备列表
		pcap_freealldevs(alldevs);
		
		//开始捕获数据包

		pcap_loop(adhandle, 0,packet_handler, NULL);
		

}
//*******************************************************************************
//函 数 名:Initialize
//功    能:初始化工作,包括取得所有网络设备,保存设备描述列表供用户选择
//输入参数:无
//输出参数:无
//编写日期:2004.07.19
//修改日期:2004.07.20
//作    者:杨光
//其他说明:
//********************************************************************************
ProbeMail::initallize()
{
	Header_out->next = NULL;//在主线程里初始化,在定时器超时后将列表里字段finish为1的清除
	Header_in->next = NULL;//在主线程里初始化,在定时器超时后将列表里字段finish为1的清除
	pcap_if_t *d;
	int i = 0;
	char errbuf[PCAP_ERRBUF_SIZE];
	
	//取得网络设备列表
	if(pcap_findalldevs(&alldevs, errbuf) == -1)
	{
		fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
		exit(1);
	}
	
	//向全局数组保存设备描述
	for(d = alldevs; d; d= d->next)
	{
		if(d->description)
			strcpy(devdesc[i], d->description);
		else
			strcpy(devdesc[i], d->name);
		i++;
	}
	devnum=i;
	if(i == 0)
	{
	    AfxMessageBox("\nNo interfaces found! Make sure WinPcap is installed.\n");
	//	printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
		return -1;
	}
//	printf("%s\n%s\n",devdesc[0], devdesc[1]);//测试
	
}
ProbeMail::~ProbeMail()
{
	delete Header_out;
	delete Header_in;
}

⌨️ 快捷键说明

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