用C#怎么做以太网帧结构的封装和解析程序,就是个简单的模拟啦... 
大家帮忙...

解决方案 »

  1.   

    找本TCPIP详解看看
    然后逐层封装帧结构就行了
    仔细点 不难
      

  2.   

    网上倒是有很多c++的,我想改成C#的,但是改了好久,错误百出...
    #include<iostream.h>
    #include<stdio.h>
    #include<conio.h>
    #include<io.h>
    #include<string.h>
    #define  BUFFER_MAX    1500
    #define  BUFFER_MIN    46
    char  preamble[8];//前导码
    char  addr_dest[6];//目的地址
    char  addr_source[6];//源地址
    unsigned char  length_data[2];//长度字段
    unsigned char  fcs;//校验序列
    char  frame[1523];//由于本次采用的8位的CRC校验,所以fcs字段也只有一个字节
    char  input[BUFFER_MAX+1];//数据字段的最大长度为1500,外加一个"\0"
    char  writefilename[10];//文件名字
    FILE  *fp;
    bool  loop;//循环控制变量
    void  framer(char *filename);//封装函数
    void jiexi(char *filename);//解析函数
    unsigned char GetFirstBit(unsigned char& a);
    void CRC(unsigned char ch,unsigned char &crc);
    void  main(int argc,char  *argv[])//主函数
    {
        if(argc!=3)//命令格式不正确时,出现帮助信息
        {
            printf("command format error!\n");
    printf("command  foramt:\n");
    printf("\n-p      帧封装 : 可执行文件名     -p       数据帧文件名");
    printf("\n-u      帧解析 :  可执行文件       -u       数据帧文件名");
    printf("\n");
        }
    else
    {
    strcpy(writefilename,argv[2]);
    if(!strcmp(argv[1],"-p"))
    {
    framer(writefilename);
    }
    if(!strcmp(argv[1],"-u"))
    {
    jiexi(writefilename);
    }
    getch();
    }
    }void jiexi(char *filename)//解析函数
    {
    unsigned char ch;
    int j;//循环变量
    int data_length;
    int count=0;
    int number=0;
        unsigned char  crctemp;
    if((fp=fopen(filename,"rb"))==NULL)
    {
    printf("Failed to open the file!");
    return;

    while(!feof(fp))
    {
    data_length=0;
    crctemp=0;
    ch=fgetc(fp);
    //printf("%x",ch);
    if(ch==0xAA)count++;//count标记前导符的个数;
    else
    {
    count=0;
    continue;
    }
    if(count==7)//找到七个字节连续的前导码
    {
    count=0;
    ch=fgetc(fp);
    if(ch==0xAB)//找到帧定界符,开始解析帧
    {
    number++;//标记帧的个数;
    for(j=0;j<6;j++) addr_dest[j]=fgetc(fp);//读入目的地址
    for(j=0;j<6;j++) addr_source[j]=fgetc(fp);//读入源地址
    length_data[0]=fgetc(fp);//读入长度字段
    length_data[1]=fgetc(fp);
    for(j=0;j<6;j++)
    {
    CRC(addr_dest[j],crctemp);//目的地址检验
    }
    for(j=0;j<6;j++)
    {
    CRC(addr_source[j],crctemp);//源地址检验
    }
    for(j=0;j<2;j++)
    {
    CRC(length_data[j],crctemp);//长度字段检验
    }

    data_length = length_data[0]*256+length_data[1];//计算数据部分长度
    for(j=0;j<data_length;j++)
    {
    ch=fgetc(fp);
    input[j]=ch;
    CRC(ch,crctemp);//数据字段检验
    }
    if(data_length<46)
    {
    for(j=0;j<46-data_length;j++)
    {
    ch=fgetc(fp);
    CRC(ch,crctemp);//如果数据字段长度小于46,多余的零也要进行校验
    }
    }
    ch=fgetc(fp);
    fcs=ch;
    CRC(0,crctemp);//最后8bit零检验
    //printf("FCS : %x",fcs);
    //printf("tempcrc : %x",crctemp);
    if(fcs==crctemp)//两者相等,判定帧正确,进行帧信息的输出
    {
    printf("\n\n=======================Number%d- frame==========================",number);
    printf("\n Sequence:%d",number);
    printf("\n Front code:");
    for(j=0;j<7;j++)
    {
    printf("AA");
    }
    printf("\n Bound flag: AB");
    printf("\n Detination  address:");
    for(j=0;j<6;j++)
    {
    printf("-%x",addr_dest[j]);
    }
    printf("\n Source  address:");
    for(j=0;j<6;j++)
    {
    printf("-%x",addr_source[j]);
    }
    printf("\n Length  :");
    for(j=0;j<2;j++)
    {
    printf("%x",length_data[j]);
    }
    printf("\nThe data: ");
    for(j=0;j<data_length;j++)
    {
    printf("%c",input[j]);
    }
    printf("\nCRC CHECK (right):%x",fcs);
    printf("\nStatus:  Accept");
    }
    else
    {
    printf(" \nFrame translation  error! Frame number is %d",number);
    }
    }
    }
    }
    count=0;
    printf("\nThe task  has already been finished!");
    return;
    }
    void framer(char *filename)//封装函数
    {
    char  ch;
    loop = true;
    int   j;//循环变量
    int   data_length ;
    if((fp = fopen(filename,"wb"))==NULL)
    {
    printf("Please input some information which we will write into the frame file:\n");
    } while(loop)
    {
    data_length=0;
    for(j=0;j<7;j++)      //写入前导码,帧前界定符;源地址;目的地址
    {
    frame[j]=0xaa;
    }
    frame[7]=0xab;
    for(j=8;j<14;j++)
    {
    frame[j]=0xff;
    }
    frame[14]=0x00;
    frame[15]=0x16;
    frame[16]=0x76;
    frame[17]=0xb4;
    frame[18]=0xe4;
    frame[19]=0x77;
    scanf("%s",&input[0]);
    while(input[data_length] != 0)data_length++;//计算从键盘输入的数据长度
    frame[20] = (unsigned char)(data_length >> 8);//写入长度字段,要做类型转换
    frame[21] = (unsigned char)(data_length&0xff);
    fcs=0;
    int frame_length=0;
    if(data_length>=BUFFER_MIN)
    {
    for(j = 0;j<data_length;j++)
    {
    frame[22+j] = input[j];
    }
    for(j=8;j<22+data_length;j++)
    {
    CRC(frame[j],fcs);
    }
    CRC(0,fcs);//输入数据的最后补上8个bit零
    frame_length=22+data_length+1;
    frame[frame_length-1]= fcs;
    }
    else
    {
    for(j=data_length;j<BUFFER_MIN;j++)
    {
    input[j]=0;
    }
    for(j = 0;j<BUFFER_MIN;j++)
    {
    frame[22+j] = input[j];
    }
    for(j=8;j<22+BUFFER_MIN;j++)
    {
    CRC(frame[j],fcs);
    }
    CRC(0,fcs);
    //printf("CRC: %x",fcs);
    frame_length=22+46+1;
    frame[68]=fcs;
    //printf("CRC: %x",frame[68]);
    /*for(j=8;j<69;j++)
    {
    printf(" %x",frame[j]);
    }*/
    }
    for(int f=0;f<frame_length;f++)//往文件中写入帧信息
    {
    if(fwrite(&frame[f],sizeof(char),1,fp)!=1)
    {
    printf("File write error!");
    fclose(fp);
    }
    }
    printf("Do you want to write the next frame?(y/n)");
    cin>>ch;
    if(ch=='n'||ch=='N')
    {
    loop=false;
    }
    else
    {
    printf("\nPlease input some information which we will write into the frame file:\n");
    continue;
    }
    }
        fclose(fp);
    printf("\nThe frame file has already been writed! It's been saved  in %s file ",filename);
    }
    unsigned char GetFirstBit(unsigned char& a) //定义取某一字节的第一位的函数,(为CRC校验,因为利用
                                                    //调用ch=fgetc(fp)时,每次都取出文件的一个字节,而我们
    //采用的crc校验是一位一位的校验;)
    {
    int temp; 
    temp=a;temp=temp<<1;       
        return (unsigned char)(temp>>8);
    }
    void CRC(unsigned char ch,unsigned char &crc)//CRC校验函数

    int i;                                  
    unsigned char data_input,crcfb;             
    for(i=0;i<8;i++)
    {
    data_input=GetFirstBit(ch);
    ch=ch<<1;
    crcfb=GetFirstBit(crc);
    crc=crc<<1;
    crc=crc|data_input;
    if(crcfb==1) crc=crc^7;
    }
    }
    求大侠帮忙改成C#的,只要解析功能和CRC验证,谢啦啦啦啦...
      

  3.   

    上面的代码太乱了,帮忙改这个...#include<iostream.h>
    #include<stdio.h>
    #include<conio.h>
    #include<io.h>
    #include<string.h>
    #define  BUFFER_MAX    1500
    #define  BUFFER_MIN    46
    char  preamble[8];//前导码
    char  addr_dest[6];//目的地址
    char  addr_source[6];//源地址
    unsigned char  length_data[2];//长度字段
    unsigned char  fcs;//校验序列
    char  frame[1523];//由于本次采用的8位的CRC校验,所以fcs字段也只有一个字节
    char  input[BUFFER_MAX+1];//数据字段的最大长度为1500,外加一个"\0"
    char  writefilename[10];//文件名字
    FILE  *fp;
    bool  loop;//循环控制变量
    void  framer(char *filename);//封装函数
    void jiexi(char *filename);//解析函数
    unsigned char GetFirstBit(unsigned char& a);
    void CRC(unsigned char ch,unsigned char &crc);
    void  main(int argc,char  *argv[])//主函数
    {
        if(argc!=3)//命令格式不正确时,出现帮助信息
        {
            printf("command format error!\n");
    printf("command  foramt:\n");
    printf("\n-p      帧封装 : 可执行文件名     -p       数据帧文件名");
    printf("\n-u      帧解析 :  可执行文件       -u       数据帧文件名");
    printf("\n");
        }
    else
    {
    strcpy(writefilename,argv[2]);
    if(!strcmp(argv[1],"-p"))
    {
    framer(writefilename);
    }
    if(!strcmp(argv[1],"-u"))
    {
    jiexi(writefilename);
    }
    getch();
    }
    }void jiexi(char *filename)//解析函数
    {
    unsigned char ch;
    int j;//循环变量
    int data_length;
    int count=0;
    int number=0;
        unsigned char  crctemp;
    if((fp=fopen(filename,"rb"))==NULL)
    {
    printf("Failed to open the file!");
    return;

    while(!feof(fp))
    {
    data_length=0;
    crctemp=0;
    ch=fgetc(fp);
    //printf("%x",ch);
    if(ch==0xAA)count++;//count标记前导符的个数;
    else
    {
    count=0;
    continue;
    }
    if(count==7)//找到七个字节连续的前导码
    {
    count=0;
    ch=fgetc(fp);
    if(ch==0xAB)//找到帧定界符,开始解析帧
    {
    number++;//标记帧的个数;
    for(j=0;j<6;j++) addr_dest[j]=fgetc(fp);//读入目的地址
    for(j=0;j<6;j++) addr_source[j]=fgetc(fp);//读入源地址
    length_data[0]=fgetc(fp);//读入长度字段
    length_data[1]=fgetc(fp);
    for(j=0;j<6;j++)
    {
    CRC(addr_dest[j],crctemp);//目的地址检验
    }
    for(j=0;j<6;j++)
    {
    CRC(addr_source[j],crctemp);//源地址检验
    }
    for(j=0;j<2;j++)
    {
    CRC(length_data[j],crctemp);//长度字段检验
    }

    data_length = length_data[0]*256+length_data[1];//计算数据部分长度
    for(j=0;j<data_length;j++)
    {
    ch=fgetc(fp);
    input[j]=ch;
    CRC(ch,crctemp);//数据字段检验
    }
    if(data_length<46)
    {
    for(j=0;j<46-data_length;j++)
    {
    ch=fgetc(fp);
    CRC(ch,crctemp);//如果数据字段长度小于46,多余的零也要进行校验
    }
    }
    ch=fgetc(fp);
    fcs=ch;
    CRC(0,crctemp);//最后8bit零检验
    //printf("FCS : %x",fcs);
    //printf("tempcrc : %x",crctemp);
    if(fcs==crctemp)//两者相等,判定帧正确,进行帧信息的输出
    {
    printf("\n\n=======================Number%d- frame==========================",number);
    printf("\n Sequence:%d",number);
    printf("\n Front code:");
    for(j=0;j<7;j++)
    {
    printf("AA");
    }
    printf("\n Bound flag: AB");
    printf("\n Detination  address:");
    for(j=0;j<6;j++)
    {
    printf("-%x",addr_dest[j]);
    }
    printf("\n Source  address:");
    for(j=0;j<6;j++)
    {
    printf("-%x",addr_source[j]);
    }
    printf("\n Length  :");
    for(j=0;j<2;j++)
    {
    printf("%x",length_data[j]);
    }
    printf("\nThe data: ");
    for(j=0;j<data_length;j++)
    {
    printf("%c",input[j]);
    }
    printf("\nCRC CHECK (right):%x",fcs);
    printf("\nStatus:  Accept");
    }
    else
    {
    printf(" \nFrame translation  error! Frame number is %d",number);
    }
    }
    }
    }
    count=0;
    printf("\nThe task  has already been finished!");
    return;
    }
    void framer(char *filename)//封装函数
    {
    char  ch;
    loop = true;
    int   j;//循环变量
    int   data_length ;
    if((fp = fopen(filename,"wb"))==NULL)
    {
    printf("Please input some information which we will write into the frame file:\n");
    } while(loop)
    {
    data_length=0;
    for(j=0;j<7;j++)      //写入前导码,帧前界定符;源地址;目的地址
    {
    frame[j]=0xaa;
    }
    frame[7]=0xab;
    for(j=8;j<14;j++)
    {
    frame[j]=0xff;
    }
    frame[14]=0x00;
    frame[15]=0x16;
    frame[16]=0x76;
    frame[17]=0xb4;
    frame[18]=0xe4;
    frame[19]=0x77;
    scanf("%s",&input[0]);
    while(input[data_length] != 0)data_length++;//计算从键盘输入的数据长度
    frame[20] = (unsigned char)(data_length >> 8);//写入长度字段,要做类型转换
    frame[21] = (unsigned char)(data_length&0xff);
    fcs=0;
    int frame_length=0;
    if(data_length>=BUFFER_MIN)
    {
    for(j = 0;j<data_length;j++)
    {
    frame[22+j] = input[j];
    }
    for(j=8;j<22+data_length;j++)
    {
    CRC(frame[j],fcs);
    }
    CRC(0,fcs);//输入数据的最后补上8个bit零
    frame_length=22+data_length+1;
    frame[frame_length-1]= fcs;
    }
    else
    {
    for(j=data_length;j<BUFFER_MIN;j++)
    {
    input[j]=0;
    }
    for(j = 0;j<BUFFER_MIN;j++)
    {
    frame[22+j] = input[j];
    }
    for(j=8;j<22+BUFFER_MIN;j++)
    {
    CRC(frame[j],fcs);
    }
    CRC(0,fcs);
    //printf("CRC: %x",fcs);
    frame_length=22+46+1;
    frame[68]=fcs;
    //printf("CRC: %x",frame[68]);
    /*for(j=8;j<69;j++)
    {
    printf(" %x",frame[j]);
    }*/
    }
    for(int f=0;f<frame_length;f++)//往文件中写入帧信息
    {
    if(fwrite(&frame[f],sizeof(char),1,fp)!=1)
    {
    printf("File write error!");
    fclose(fp);
    }
    }
    printf("Do you want to write the next frame?(y/n)");
    cin>>ch;
    if(ch=='n'||ch=='N')
    {
    loop=false;
    }
    else
    {
    printf("\nPlease input some information which we will write into the frame file:\n");
    continue;
    }
    }
        fclose(fp);
    printf("\nThe frame file has already been writed! It's been saved  in %s file ",filename);
    }
    unsigned char GetFirstBit(unsigned char& a) //定义取某一字节的第一位的函数,(为CRC校验,因为利用
                                                    //调用ch=fgetc(fp)时,每次都取出文件的一个字节,而我们
    //采用的crc校验是一位一位的校验;)
    {
    int temp; 
    temp=a;temp=temp<<1;       
        return (unsigned char)(temp>>8);
    }
    void CRC(unsigned char ch,unsigned char &crc)//CRC校验函数

    int i;                                  
    unsigned char data_input,crcfb;             
    for(i=0;i<8;i++)
    {
    data_input=GetFirstBit(ch);
    ch=ch<<1;
    crcfb=GetFirstBit(crc);
    crc=crc<<1;
    crc=crc|data_input;
    if(crcfb==1) crc=crc^7;
    }
    }