各位大侠能不能讲讲UDP校验和原理并给一份计算校验和的源程序

z9851214 2004-11-17 10:07:07
如题

多谢
...全文
234 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shakira008 2004-11-20
  • 打赏
  • 举报
回复
up
z9851214 2004-11-19
  • 打赏
  • 举报
回复
up
gdy119 2004-11-17
  • 打赏
  • 举报
回复
先把校验和置0 ,取反码求和,放入检验和,验证的时候同样计算,看是否为0
//--------------------------------------------------------------------
一般UDP 都是采取那种方式
kingzai 2004-11-17
  • 打赏
  • 举报
回复
看看《TCP/IP详解卷一:协议》中11.3节中的UDP检验和
chen_jun_fen 2004-11-17
  • 打赏
  • 举报
回复
你说的是udp数据重组 ?
发送放 设置一个index,
客户端收到后,可以根据这个index,来判断这个包是否是正确的下一个包
hjunxu 2004-11-17
  • 打赏
  • 举报
回复
先把校验和置0 ,取反码求和,放入检验和,验证的时候同样计算,看是否为0
z9851214 2004-11-17
  • 打赏
  • 举报
回复
各位有没有源代码,能不能贴一下?

我是重新打包发出,虽然显示“send ok",但我用sniffer 好象并没有发出?

这是怎么回事?

以下是我的源代码,

////////////////////////////////////////////////////////////////////
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,357

社区成员

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

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