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