📄 ipheadersetupdlg.cpp
字号:
// IpHeaderSetupDlg.cpp : implementation file
//
#include "stdafx.h"
#include "sendpkt.h"
#include "IpHeaderSetupDlg.h"
#include "global.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CIpHeaderSetupDlg dialog
CIpHeaderSetupDlg::CIpHeaderSetupDlg(CWnd* pParent /*=NULL*/)
: CDialog(CIpHeaderSetupDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CIpHeaderSetupDlg)
m_strOptions = _T("");
m_strData = _T("");
//}}AFX_DATA_INIT
//g_IpFrame中的Version实际上为IP头的长度
//g_IpFrame中的HeaderLen实际上为版本
m_nHeadLen=g_IpFrame.ipHeader.Version;
m_nVersion=g_IpFrame.ipHeader.HeaderLen;
m_nServiceType=g_IpFrame.ipHeader.ServiceType;
m_nIden=ntohs(g_IpFrame.ipHeader.Identification);
//由于网络字节序和数据结构的原因,Flags和FragOffset需作进一步处理
m_nFlag=g_IpFrame.ipHeader.Flags;
m_nOffset=g_IpFrame.ipHeader.FragOffset;
m_nTtl=g_IpFrame.ipHeader.TTL;
m_nProtocol=g_IpFrame.ipHeader.Protocol;
//g_IpFrame.ipHeader.HeaderCheckSum=0;
memcpy(&m_IpDestAddr,g_IpFrame.ipHeader.DestIpAddr,4);
memcpy(&m_IpSrcAddr,g_IpFrame.ipHeader.SrcIpAddr,4);
unsigned char tempStr[5000];
if(m_nHeadLen==5)
{
ASSERT(ntohs(g_IpFrame.ipHeader.TotalLen)-m_nHeadLen*4<5000);
memset(tempStr,0,sizeof(tempStr));
memcpy(tempStr,g_IpFrame.OptionsAndData,ntohs(g_IpFrame.ipHeader.TotalLen)-m_nHeadLen*4);
m_strOptions = _T("");
m_strData =tempStr;
}
else
{
ASSERT(m_nHeadLen*4-20<5000);
memset(tempStr,0,sizeof(tempStr));
memcpy(tempStr,g_IpFrame.OptionsAndData,m_nHeadLen*4-20);
m_strOptions=tempStr;
ASSERT(ntohs(g_IpFrame.ipHeader.TotalLen)-m_nHeadLen*4<5000);
memset(tempStr,0,sizeof(tempStr));
memcpy(tempStr,&g_IpFrame.OptionsAndData[m_nHeadLen*4-20],ntohs(g_IpFrame.ipHeader.TotalLen)-m_nHeadLen*4);
m_strData =tempStr;
}
}
void CIpHeaderSetupDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CIpHeaderSetupDlg)
DDX_Control(pDX, IDC_IPSRCADDR, m_CtlIPSrcAddr);
DDX_Control(pDX, IDC_IPDESTADDR, m_CtlIPDestAddr);
DDX_Text(pDX, IDC_VERSION, m_nVersion);
DDV_MinMaxUInt(pDX, m_nVersion, 1, 15);
DDX_Text(pDX, IDC_HEADERLENGTH, m_nHeadLen);
DDV_MinMaxUInt(pDX, m_nHeadLen, 5, 15);
DDX_Text(pDX, IDC_SERVICETYPE, m_nServiceType);
DDX_Text(pDX, IDC_IDENTIFICATION, m_nIden);
DDX_Text(pDX, IDC_FLAG, m_nFlag);
DDX_Text(pDX, IDC_OFFSET, m_nOffset);
DDX_Text(pDX, IDC_TTl, m_nTtl);
DDX_Text(pDX, IDC_PROTOCOL, m_nProtocol);
DDX_Text(pDX, IDC_OPTIONS, m_strOptions);
DDV_MaxChars(pDX, m_strOptions, 40);
DDX_Text(pDX, IDC_DATA, m_strData);
DDV_MaxChars(pDX, m_strData, 1480);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CIpHeaderSetupDlg, CDialog)
//{{AFX_MSG_MAP(CIpHeaderSetupDlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CIpHeaderSetupDlg message handlers
BOOL CIpHeaderSetupDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_CtlIPSrcAddr.SetAddress(m_IpSrcAddr.nField0,m_IpSrcAddr.nField1,m_IpSrcAddr.nField2,m_IpSrcAddr.nField3);
m_CtlIPDestAddr.SetAddress(m_IpDestAddr.nField0,m_IpDestAddr.nField1,m_IpDestAddr.nField2,m_IpDestAddr.nField3);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CIpHeaderSetupDlg::OnOK()
{
// TODO: Add extra validation here
int nIpHeadLen;
int nOptionsLen;
char strTemp[255];
memset(strTemp,0,sizeof(strTemp));
GetDlgItem(IDC_HEADERLENGTH)->GetWindowText(strTemp,sizeof(strTemp));
nIpHeadLen=atoi(strTemp)*4;
memset(strTemp,0,sizeof(strTemp));
nOptionsLen=GetDlgItem(IDC_OPTIONS)->GetWindowText(strTemp,sizeof(strTemp));
if(nIpHeadLen-20-nOptionsLen<0)
{
int nLen;
if(nOptionsLen%4!=0)
{
nLen=5+nOptionsLen/4+1;
}
else
{
nLen=5+nOptionsLen/4;
}
CString str;
str.Format("Ip头的长度和Options的长度不符合,Ip头长度应设为%d以上",nLen);
AfxMessageBox(str);
return;
}
// m_nHeadLen*4-20-OptionsLen>=0);
BYTE nField0,nField1,nField2,nField3;
m_CtlIPDestAddr.GetAddress(nField0,nField1,nField2,nField3);
m_IpDestAddr.nField0=nField0;
m_IpDestAddr.nField1=nField1;
m_IpDestAddr.nField2=nField2;
m_IpDestAddr.nField3=nField3;
m_CtlIPSrcAddr.GetAddress(nField0,nField1,nField2,nField3);
m_IpSrcAddr.nField0=nField0;
m_IpSrcAddr.nField1=nField1;
m_IpSrcAddr.nField2=nField2;
m_IpSrcAddr.nField3=nField3;
CDialog::OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -