UDP校验和

afafafafafafa 2010-04-26 05:21:28
谁有计算UDP校验和的代码发出来参考下 谢谢了
...全文
216 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
jyh_baoding 2010-04-28
  • 打赏
  • 举报
回复
帮顶一个
尹成 2010-04-26
  • 打赏
  • 举报
回复
以下是我的源代码,

////////////////////////////////////////////////////////////////////
char* szSendBuf=Buffer;

//填充IP首部
ipHeader.h_lenver=iphdr->h_lenver;
ipHeader.tos=iphdr->tos;
ipHeader.total_len=iphdr->total_len;
ipHeader.ident=iphdr->ident;
ipHeader.frag_and_flags=iphdr->frag_and_flags;
ipHeader.ttl=iphdr->ttl;
ipHeader.proto=iphdr->proto;
ipHeader.checksum=iphdr->checksum; //注意添校验和
ipHeader.sourceIP=inet_addr(FilSou);
ipHeader.destIP=inet_addr(FilDes);

//填充UDP首部
udpHeader.uh_sport=pUdpHeader->uh_sport;
udpHeader.uh_dport=pUdpHeader->uh_sport;
udpHeader.uh_len=pUdpHeader->uh_len;
udpHeader.uh_sum=/*pUdpHeader->uh_sum*/0;


int iUdpChecksumSize = 0;
ZeroMemory(Buffer,MAX_PACKET_SIZE); //初始化发送缓冲区

memcpy(szSendBuf, &ipHeader.sourceIP, sizeof(ipHeader.sourceIP));
szSendBuf += sizeof(ipHeader.sourceIP);
iUdpChecksumSize += sizeof(ipHeader.sourceIP);

memcpy(szSendBuf, &ipHeader.destIP, sizeof(ipHeader.destIP));

szSendBuf += sizeof(ipHeader.destIP);
iUdpChecksumSize += sizeof(ipHeader.destIP);

szSendBuf++;
iUdpChecksumSize += 1;

memcpy(szSendBuf, &ipHeader.proto, sizeof(ipHeader.proto));
szSendBuf += sizeof(ipHeader.proto);
iUdpChecksumSize += sizeof(ipHeader.proto);

memcpy(szSendBuf, &udpHeader.uh_len, sizeof(udpHeader.uh_len));
szSendBuf += sizeof(udpHeader.uh_len);
iUdpChecksumSize += sizeof(udpHeader.uh_len);

memcpy(szSendBuf, &udpHeader, sizeof(udpHeader));
szSendBuf += sizeof(udpHeader);
iUdpChecksumSize += sizeof(udpHeader);

int UdpLenth = udpHeader.uh_len;


char temp[2000];

for (int m=0; m<UdpLenth;m++,szSendBuf++)
temp[m]=*szSendBuf;

// *szSendBuf ^=1;

iUdpChecksumSize +=UdpLenth;

unsigned cksum = checksum((USHORT *)Buffer, iUdpChecksumSize);
udpHeader.uh_sum = cksum;

ZeroMemory(Buffer, MAX_PACKET_SIZE);
szSendBuf = Buffer;

memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
szSendBuf += sizeof(ipHeader);
memcpy(szSendBuf, &udpHeader, sizeof(udpHeader));
szSendBuf += sizeof(udpHeader);
memcpy(szSendBuf,temp, UdpLenth);

if(bind(sock, (SOCKADDR FAR *)&Sender, sizeof(Sender))!=0)
{
printf( "Can't bind sender socket to local port!Program stop.\n ");//初始化失败返回-1
return -1;
}


int rect=sendto(sock, Buffer, RecvSize,
0, (struct sockaddr*)&addr_in, sizeof(addr_in));

if (rect==SOCKET_ERROR)
{
printf("UDP send error!:%d\\ n",WSAGetLastError());
return false;
}
else
printf("UDP send ok!\n");

////////////////////////////////////////////////////////////////





//CheckSum:计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)
{
unsigned long cksum=0;
while(size >1)
{
cksum+=*buffer++;
size -=sizeof(USHORT);
}
if(size )
{
cksum += *(UCHAR*)buffer;
}

cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧