计算机网络实验六代码

实验8:代码参考
//FrameEncapDlg.h : header file
class CFrameEncapDlg : public CDialog
{
public:
//{{AFX_DATA(cipv6EncapDlg)
enum{ IDD = IDD_FRAMEENCAP_DIALOG };
CString m_Information;
CString m_Data;
//}AFX_DATA
protected;
//{{AFX_MSG(CIpv6EncapDlg)
afx_msg void OnEncap();
//}}AFX_MSG
private:
unsigned char CheckSum(unsigned char* buffer,int size);
typedef struct FRAME_STRUCT //以太帧结构
{
unsigned char Preamble[7]; //前导码
unsigned char Delimiter; //帧前定界符
unsigned char Destination[6]; //目的地址
unsigned char Source[6]; //源地址
unsigned short Length; //帧长度
Cstring Data; //数据部分
unsigned int Checksum; //帧校验
}frame_struct;
};


//FrameEncapDlg.cpp : implementation file
#include "stdafx.h"
#include "FrameEncap.h"
#include "FrameEncapDlg.h"
void CFrameEncapDlg::OnEncap()
{
bool FrameAnother=true;
int FrameNum=0;
CString DataBuf;
DataBuf=m_Data;
if(DataBuf==" ")
{
MessageBox("数据部分不能为空!");
return;
}
int DataLen;
DataLen=DataBuf.GetLength();
while(FrameAnother==true)
{
FrameNum++;
CString str;
str.Format("Frame [%d] start...\r\n",FrameNum);
m_Information+=str;
int i;
frame_struct Frame;
for(i=0;i<7;i++) //填充前导码
Frame.Preamble[i]=char(0xaa);
Frame.Delimiter=char(0xab); //填充帧前定界符
Frame.Destination[O]=char(0x80);//填充目的地址
Frame.Destination[1]=char(0X00);
Frame.Destination[2]=char(0xff);
Frame.Destination[3]=char(0x60);
Frame.Destination[4]=char(0x2c);
Frame.Destination[5]=char(0xdc);
Frame.Source[0]=char(0x80); //填充源地址
Frame.Source[1]=char(0x00);
Frame.Source[2]=char(0xfe);
Frame.Source[3]=char(0x85);
Frame.Source[4]=char(0x3a);
Frame.Source[5]=char(0x5f);
CString TempData;
if(DataLen<46)
{
FrameAnother=false;
for(i=0;i<46-DataLen;i++)
DataBuf+=char(0x00);
TempData=DataBuf;
}
else
{
if(DataLen>1500)
{
FrameAnother=ture;
TempData=DataBuf.Left(1500);
DataBuf=DataBuf.Mid(1500,DataLen-1500);
DataLen=DataLen-1500;
}
else
{
FrameAnother=false;
TempData=DataBuf;
}
}
Frame.Length=TempData.GetLengeh()+18;
Frame.Data=TempData;
Frame.Checksum=0;
unsigned char CheckBuf[65535];
memset(CheckBuf,0,65535);
memcpy(CheckBuf,&Frame.Destination,6);
memcpy(CheckBuf,&Frame.Source,6);
memcpy(CheckBuf,&Frame.Length,2);
memcpy(CheckBuf,&Frame.Data,Frame.Length-18);
memcpy(CheckBuf,&Frame.Checksum,4);
Frame.Checksum=(unsigned int)CheckSum(CheckBuf,Frame.Length);
m_Information+="Preamble:";
for(i=0;i<7;i++)
{
str.Format("%x",Frame.Preamble[i]);
m_Information+=str;
if(i!=6)
m_Information+=" ";
}
m_Information+="\r\nStart Delimiter: ";
str.Format("%x",Frame.Delimiter);
m_Informati

on+=str;
m_Information+="\r\nSource MAC Address: ";
for(i=o;i<6;i++)
{
str.Format("%02x",Frame.Source[i]);
m_Information+=str;
if(i!=5)
m_Information+="-";
}
m_Information+="\r\nDestination MAC Address: ";
for(i=o;i<6;i++)
{
str.Format("%02x",Frame.Destination[i]);
m_Information+=str;
if(i!=5)
m_Information+="-";
}
m_Information+="\r\nLength: ";
str.Format("%d",Frame.Length);
m_Information+=str;
m_Information+="\r\nData: ";
m_Information+=Frame.Data;
m_Information+="\r\nChecksum: ";
str.Format("%d",Frame.Checksum);
m_Information+=str;
m_Information+="\r\n";
}
UpdateData(false);
}


unsigned char CFrameEncapdlg::CheckSum(unsigned char* buffer,int size)
{
unsigned char crc=0; // 初始化CRC余数
for(int i=0;i{
unsigned temp=buffer[i];
unsigned char j;
for(j=(unsigned char)0x80;j>0;j>>=1)
{
if(crc&0x80) // 余数最高位为1
{
crc<<=1;
if(temp&j)
crc^=0x01; //相应位递补余数末位
crc^=0x07;
}
else //余数最高位为0
{
crc<<=1;
if(temp&j)
crc^=0x01;
}
}
}
return crc;
}

相关文档
最新文档