📄 ethernetdlg.cpp
字号:
// E8023TaggedDlg.cpp : implementation file
//
#include "stdafx.h"
#include "sendpkt.h"
#include "EthernetDlg.h"
#include "IpHeaderSetupDlg.h"
#include "global.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CEthernetDlg dialog
CEthernetDlg::CEthernetDlg(CWnd* pParent /*=NULL*/)
: CDialog(CEthernetDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CEthernetDlg)
m_strSrcMac = _T("00E04C5EF3DB");
m_strDestMac = _T("010203040506");
m_nPackNum = 1000;
m_nSelection = 0;
m_nTagControl = 0;
//}}AFX_DATA_INIT
m_pLoopThread=NULL;
}
void CEthernetDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CEthernetDlg)
DDX_Control(pDX, IDC_PROGRESS1, m_Progress);
DDX_Control(pDX, IDC_ETHERNETTYPE, m_ComboEType);
DDX_Control(pDX, IDC_ADAPTER, m_ComboAdapter);
DDX_Control(pDX, IDC_PACKNUM, m_editPackNum);
DDX_Control(pDX, IDC_STOP, m_btnStop);
DDX_Control(pDX, IDC_SEND, m_btnSend);
DDX_Control(pDX, IDC_IPHEADERSETUP, m_btnIpHeader);
DDX_Control(pDX, IDCANCEL, m_btnCancel);
DDX_Control(pDX, IDC_SRCMAC, m_editSrcMac);
DDX_Control(pDX, IDC_DESTMAC, m_editDestMac);
DDX_Text(pDX, IDC_SRCMAC, m_strSrcMac);
DDV_MaxChars(pDX, m_strSrcMac, 12);
DDX_Text(pDX, IDC_DESTMAC, m_strDestMac);
DDV_MaxChars(pDX, m_strDestMac, 12);
DDX_Text(pDX, IDC_PACKNUM, m_nPackNum);
DDV_MinMaxInt(pDX, m_nPackNum, 1, 2147483647);
DDX_Radio(pDX, IDC_RADIOLIMIT, m_nSelection);
DDX_Text(pDX, IDC_TAGCONTROL, m_nTagControl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CEthernetDlg, CDialog)
//{{AFX_MSG_MAP(CEthernetDlg)
ON_BN_CLICKED(IDC_IPHEADERSETUP, OnIpHeaderSetup)
ON_BN_CLICKED(IDC_SEND, OnSend)
ON_BN_CLICKED(IDC_RADIOLIMIT, OnRadioLimit)
ON_BN_CLICKED(IDC_RADIOLOOP, OnRadioLoop)
ON_BN_CLICKED(IDC_STOP, OnStop)
ON_CBN_SELCHANGE(IDC_ETHERNETTYPE, OnSelChangeEthernetType)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CEthernetDlg message handlers
void CEthernetDlg::OnIpHeaderSetup()
{
// TODO: Add your control notification handler code here
CIpHeaderSetupDlg dlg;
int retCode;
retCode=dlg.DoModal();
if(retCode==IDOK)
{
memset(&g_IpFrame,0,sizeof(g_IpFrame));
FillIpHeader(&dlg);
}
}
void CEthernetDlg::OnSend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(!IsMacAddrLenEnough())
return;
struct MACFRAME macFrame;
memset(&macFrame,0,sizeof(macFrame));
//构造包
unsigned char DestMac[6];
unsigned char SrcMac[6];
memset(DestMac,0,sizeof(DestMac));
memset(SrcMac,0,sizeof(SrcMac));
//将12字节的地址串转化为6字节的MAC地址
MACStringToMAC(m_strDestMac.GetBuffer(m_strDestMac.GetLength()),DestMac);
MACStringToMAC(m_strSrcMac.GetBuffer(m_strSrcMac.GetLength()),SrcMac);
m_strDestMac.ReleaseBuffer();
m_strSrcMac.ReleaseBuffer();
memcpy(macFrame.DestMacAddr,DestMac,sizeof(DestMac));
memcpy(macFrame.SrcMacAddr,SrcMac,sizeof(SrcMac));
switch(m_ComboEType.GetCurSel())
{
//select Ethernet 802.3-Untagged
case 0:
memcpy(&macFrame.u_macData.E8023Untagged.ipFrame,&g_IpFrame,ntohs(g_IpFrame.ipHeader.TotalLen));
macFrame.u_macData.E8023Untagged.Len=htons(14+ntohs(g_IpFrame.ipHeader.TotalLen));
g_Adapter.FillPacket((unsigned char*)&macFrame,14+ntohs(g_IpFrame.ipHeader.TotalLen));
break;
//select Ethernet 802.3-Tagged
case 1:
memcpy(&macFrame.u_macData.E8023Tagged.ipFrame,&g_IpFrame,ntohs(g_IpFrame.ipHeader.TotalLen));
//TAG PROTOCOL ID=8100H
macFrame.u_macData.E8023Tagged.ProtocolId=htons(0x8100);
//TAG CONTROL
macFrame.u_macData.E8023Tagged.TagField=htons(m_nTagControl);
macFrame.u_macData.E8023Tagged.Len=htons(18+ntohs(g_IpFrame.ipHeader.TotalLen));
g_Adapter.FillPacket((unsigned char*)&macFrame,18+htons(g_IpFrame.ipHeader.TotalLen));
break;
//select Ethernet II-Untagged
case 2:
memcpy(&macFrame.u_macData.EIIUntagged.ipFrame,&g_IpFrame,ntohs(g_IpFrame.ipHeader.TotalLen));
macFrame.u_macData.EIIUntagged.EType=htons(0x0800);
g_Adapter.FillPacket((unsigned char*)&macFrame,14+htons(g_IpFrame.ipHeader.TotalLen));
break;
//select Ethernet II-Tagged
case 3:
memcpy(&macFrame.u_macData.EIITagged.ipFrame,&g_IpFrame,ntohs(g_IpFrame.ipHeader.TotalLen));
macFrame.u_macData.EIITagged.EType=htons(0x0800);
macFrame.u_macData.EIITagged.ProtocolId=htons(0x8100);
macFrame.u_macData.EIITagged.TagField=htons(m_nTagControl);
g_Adapter.FillPacket((unsigned char*)&macFrame,18+htons(g_IpFrame.ipHeader.TotalLen));
break;
//select Ethernet Snap-Untagged
case 4:
memcpy(&macFrame.u_macData.ESnapUntagged.ipFrame,&g_IpFrame,ntohs(g_IpFrame.ipHeader.TotalLen));
macFrame.u_macData.ESnapUntagged.Dsap=0xAA;
macFrame.u_macData.ESnapUntagged.Ssap=0xAA;
macFrame.u_macData.ESnapUntagged.Ctrl=0x03;
macFrame.u_macData.ESnapUntagged.Org=htons(0x000000);
macFrame.u_macData.ESnapUntagged.EType=htons(0x0800);
macFrame.u_macData.ESnapUntagged.Len=htons(22+ntohs(g_IpFrame.ipHeader.TotalLen));
g_Adapter.FillPacket((unsigned char*)&macFrame,22+ntohs(g_IpFrame.ipHeader.TotalLen));
break;
//select Ethernet Snap_Tagged
case 5:
memcpy(&macFrame.u_macData.ESnapTagged.ipFrame,&g_IpFrame,ntohs(g_IpFrame.ipHeader.TotalLen));
macFrame.u_macData.ESnapTagged.Dsap=0xAA;
macFrame.u_macData.ESnapTagged.Ssap=0xAA;
macFrame.u_macData.ESnapTagged.Ctrl=0x03;
macFrame.u_macData.ESnapTagged.Org=htons(0x000000);
macFrame.u_macData.ESnapTagged.EType=htons(0x0800);
macFrame.u_macData.ESnapTagged.ProtocolId=htons(0x8100);
macFrame.u_macData.ESnapTagged.TagField=htons(m_nTagControl);
macFrame.u_macData.ESnapTagged.Len=htons(26+ntohs(g_IpFrame.ipHeader.TotalLen));
g_Adapter.FillPacket((unsigned char*)&macFrame,26+ntohs(g_IpFrame.ipHeader.TotalLen));
break;
default:
ASSERT(FALSE);
}
//填充完毕
if(g_Adapter.Open(m_ComboAdapter.GetCurSel())==FALSE)
{
AfxMessageBox("Unable to open adapter");
return;
}
g_Adapter.InitPacket();
if(m_nSelection==0) //有限包
{
g_Adapter.SetNumWrites(m_nPackNum);
g_Adapter.SendPacket(TRUE);
g_Adapter.SetCurFillPos(0);
g_Adapter.FreePacket();
}
else //循环发送
{
//创建循环发送线程
g_bRunning=TRUE;
m_btnSend.EnableWindow(FALSE);
m_btnCancel.EnableWindow(FALSE);
m_btnIpHeader.EnableWindow(FALSE);
m_btnStop.EnableWindow(TRUE);
g_Adapter.SetNumWrites(1000);
m_pLoopThread=AfxBeginThread(ThreadFuncOfLoopSend,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
m_pLoopThread->m_bAutoDelete=FALSE;
m_pLoopThread->ResumeThread();
SetTimer(1,500,NULL);
m_Progress.ShowWindow(SW_SHOW);
}
}
void CEthernetDlg::OnRadioLimit()
{
// TODO: Add your control notification handler code here
m_editPackNum.EnableWindow(TRUE);
}
void CEthernetDlg::OnRadioLoop()
{
// TODO: Add your control notification handler code here
m_editPackNum.EnableWindow(FALSE);
}
void CEthernetDlg::OnStop()
{
// TODO: Add your control notification handler code here
g_bRunning=FALSE;
ASSERT(m_pLoopThread!=NULL);
if(m_pLoopThread->m_hThread)
{
DWORD exitcode;
if(GetExitCodeThread(m_pLoopThread->m_hThread,&exitcode))
{
if(exitcode==STILL_ACTIVE)
{
WaitForSingleObject(m_pLoopThread->m_hThread,INFINITE);
}
}
CloseHandle(m_pLoopThread->m_hThread);
}
delete m_pLoopThread;
m_pLoopThread=NULL;
m_btnSend.EnableWindow(TRUE);
m_btnCancel.EnableWindow(TRUE);
m_btnIpHeader.EnableWindow(TRUE);
m_btnStop.EnableWindow(FALSE);
KillTimer(1);
m_Progress.ShowWindow(SW_HIDE);
}
BOOL CEthernetDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
int nAdapterNum;
nAdapterNum=g_Adapter.GetAdapterNumber();
for(int i=0;i<nAdapterNum;i++)
m_ComboAdapter.AddString(g_Adapter.GetAdapterName(i));
m_ComboAdapter.SetCurSel(0);
m_ComboEType.SetCurSel(0);
GetDlgItem(IDC_TAGLABEL)->EnableWindow(FALSE);
GetDlgItem(IDC_TAGCONTROL)->EnableWindow(FALSE);
m_btnStop.EnableWindow(FALSE);
m_Progress.ShowWindow(SW_HIDE);
m_Progress.SetRange(0,100);
m_Progress.SetPos(0);
m_Progress.SetStep(20);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CEthernetDlg::OnSelChangeEthernetType()
{
// TODO: Add your control notification handler code here
BOOL bShow;
switch(m_ComboEType.GetCurSel())
{
case 0:
case 2:
case 4:
bShow=FALSE;
break;
case 1:
case 3:
case 5:
bShow=TRUE;
break;
default:
ASSERT(FALSE);
}
GetDlgItem(IDC_TAGLABEL)->EnableWindow(bShow);
GetDlgItem(IDC_TAGCONTROL)->EnableWindow(bShow);
}
BOOL CEthernetDlg::IsMacAddrLenEnough()
{
if(m_strDestMac.GetLength()<12)
{
AfxMessageBox("请将目标MAC地址填足");
return FALSE;
}
if(m_strSrcMac.GetLength()<12)
{
AfxMessageBox("请将源MAC地址填足");
return FALSE;
}
return TRUE;
}
void CEthernetDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_Progress.StepIt();
CDialog::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -