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

📄 ethernetdlg.cpp

📁 基于短消息的移动通信场强信号检测管理软件,软件基于PC,用于与嵌入式信号接收板通信
💻 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 + -