2 u012258398 u012258398 于 2015.07.13 16:13 提问

CRC-32校验通信软件设计 15C

环境要求:Windows;信息交换内容为文本文件;WinSock通信
编码要求:用模2除法计算CRC码,生成多项式为CRC-32
功能要求:能在两台计算机机上运行程序,一台产生CRC码,另一台校验。
我已经有生成CRC码的程序了,但是不知道怎么可以实现WinSock通信,一定要满足WinSock通信的要求,最好是C语言的,要是别的能成功也行。
跪求大神帮帮忙,我把资料都发过去,一直在线等!!
1.发送端电脑A源程序:

 #include <stdio.h>
#include <stdlib.h>

__int64 crc;  //定义全局变量crc
__int64 create(__int64 data,__int64 POLY,int crcbitnumber) //生成crc码子函数
{
__int64 regi = 0x0; // 使寄存器为0
__int64 data_temp;
data_temp=data;
int databitnumber=32;  //定义数据位数,即输入的十六进制数最多8位
data<<= crcbitnumber; //data左移32位即在数据位后添加32个0
for ( int cur_bit = databitnumber+crcbitnumber-1; cur_bit >= 0; -- cur_bit )       //处理64 次(32 比特待测数据+32 比特扩展0),前32次是加载32比特待测数据,后32次是加载一比特扩展0
{
if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 ) regi = regi ^ POLY;
    regi <<= 1;
unsigned short tmp = ( data >> cur_bit ) & 0x0001; //加载待测数据1比特到tmp中,tmp只有1比特
    regi |= tmp; //这1比特加载到寄存器中
}

if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
  regi = regi ^ POLY; //做最后一次XOR
printf("\t\t\tcrc=%x\n",regi);
crc=regi;
data_temp<<=32;
data_temp=data_temp+regi;
return data_temp;
}

void main()
{
FILE*lp_code,*lp_crc;//定义文件指针
__int64 code;//code即为实际传输的数据
__int64 data;//data为从键盘输入的数据即要传输的数据
__int64 POLY= (__int64)0x254028D1*0x7   ;
int crcbitnumber=32;
printf("\n\t\t************** CRC校验发送端 **************\n\n");
printf("\t\t\t请输入需要传输的数据:");
scanf("%I64x",&data);   //%x,输入16进制整数
code=create(data,POLY,crcbitnumber);
printf("\t\t\tCODE=%I64x\n\n",code);
lp_code=fopen("D:\\tongxinwang\\code.txt","w");  //建立文件,以写入方式打开
lp_crc = fopen("D:\\tongxinwang\\crc.txt","w");
 fprintf(lp_code,"%I64x",code);
 fprintf(lp_crc,"%I64x",crc);
getchar();
fclose(lp_code);
fclose(lp_crc);
}

2.接收端电脑B源程序:

 #include <stdio.h>
#include <stdlib.h>

__int64 exam(__int64 data,__int64 POLY,int crcbitnumber) 
{
__int64 regi = 0x0;
__int64 data_temp;
data_temp=data;
int databitnumber=32;
for ( int cur_bit = databitnumber+crcbitnumber-1; cur_bit >= 0; -- cur_bit )
{
  if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
      regi = regi ^ POLY;
  regi <<= 1;
  unsigned short tmp = ( data >> cur_bit ) & 0x0001;
  regi |= tmp; 
}
if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
  regi = regi ^ POLY; 
return(regi);
}

void main()
{FILE* lp_code;
__int64 code;
__int64 result;
__int64 POLY=(__int64) 0x254028D1*0x7;
int crcbitnumber=32;
printf("\n\t\t************** CRC校验接收端 **************\n\n");
 lp_code=fopen("\\\\192.168.0.27\\tongxinwang\\code.txt","r"); 
fscanf(lp_code,"%I64x\n",&code);
printf("\t\t\tcode=%I64x\n\n",code);
fclose(lp_code);
result=exam(code,POLY,crcbitnumber);
printf("\t\t\tresult=%I64x,",result);
if (result==0)
{printf("数据传输正确!\n\n");
code>>=32;
printf("\t\t\t去除CRC校验码后数据是%I64x。\n\n",code);
}
else printf("\n\t\t\t数据传输失败。");
}

2个回答

u012258398
u012258398   2015.07.13 16:19

1.发送端电脑A源程序:
#include
#include

int64 crc; //定义全局变量crc
__int64 create(
int64 data,__int64 POLY,int crcbitnumber) //生成crc码子函数
{
__int64 regi = 0x0; // 使寄存器为0
__int64 data_temp;
data_temp=data;
int databitnumber=32; //定义数据位数,即输入的十六进制数最多8位
data<<= crcbitnumber; //data左移32位即在数据位后添加32个0
for ( int cur_bit = databitnumber+crcbitnumber-1; cur_bit >= 0; -- cur_bit ) //处理64 次(32 比特待测数据+32 比特扩展0),前32次是加载32比特待测数据,后32次是加载一比特扩展0
{
if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 ) regi = regi ^ POLY;
regi <<= 1;
unsigned short tmp = ( data >> cur_bit ) & 0x0001; //加载待测数据1比特到tmp中,tmp只有1比特
regi |= tmp; //这1比特加载到寄存器中
}

if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
regi = regi ^ POLY; //做最后一次XOR
printf("\t\t\tcrc=%x\n",regi);
crc=regi;
data_temp<<=32;
data_temp=data_temp+regi;
return data_temp;
}

void main()
{
FILE*lp_code,*lp_crc;//定义文件指针
int64 code;//code即为实际传输的数据
__int64 data;//data为从键盘输入的数据即要传输的数据
__int64 POLY= (
int64)0x254028D1*0x7 ;
int crcbitnumber=32;
printf("\n\t\t************** CRC校验发送端 **************\n\n");
printf("\t\t\t请输入需要传输的数据:");
scanf("%I64x",&data); //%x,输入16进制整数
code=create(data,POLY,crcbitnumber);
printf("\t\t\tCODE=%I64x\n\n",code);
lp_code=fopen("D:\tongxinwang\code.txt","w"); //建立文件,以写入方式打开
lp_crc = fopen("D:\tongxinwang\crc.txt","w");
fprintf(lp_code,"%I64x",code);
fprintf(lp_crc,"%I64x",crc);
getchar();
fclose(lp_code);
fclose(lp_crc);
}

2.接收端电脑B源程序:
#include
#include

int64 exam(int64 data,__int64 POLY,int crcbitnumber)
{
__int64 regi = 0x0;
__int64 data_temp;
data_temp=data;
int databitnumber=32;
for ( int cur_bit = databitnumber+crcbitnumber-1; cur_bit >= 0; -- cur_bit )
{
if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
regi = regi ^ POLY;
regi <<= 1;
unsigned short tmp = ( data >> cur_bit ) & 0x0001;
regi |= tmp;
}
if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
regi = regi ^ POLY;
return(regi);
}

void main()
{FILE* lp_code;
int64 code;
__int64 result;
__int64 POLY=(
int64) 0x254028D1*0x7;
int crcbitnumber=32;
printf("\n\t\t************** CRC校验接收端 **************\n\n");
lp_code=fopen("\\192.168.0.27\tongxinwang\code.txt","r");
fscanf(lp_code,"%I64x\n",&code);
printf("\t\t\tcode=%I64x\n\n",code);
fclose(lp_code);
result=exam(code,POLY,crcbitnumber);
printf("\t\t\tresult=%I64x,",result);
if (result==0)
{printf("数据传输正确!\n\n");
code>>=32;
printf("\t\t\t去除CRC校验码后数据是%I64x。\n\n",code);
}
else printf("\n\t\t\t数据传输失败。");
}

以上是采用文件共享形式的代码,就是在D盘建了一个文件夹,属性设置为共享了,能通过网络访问。怎么改成用Winsock通信呢??
我是新人,不知道这样格式对不对

devmiao
devmiao   Ds   Rxr 2015.07.14 05:47
Csdn user default icon
上传中...
上传图片
插入图片