?? 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 + -