社区
网络编程
帖子详情
各位大侠能不能讲讲UDP校验和原理并给一份计算校验和的源程序
z9851214
2004-11-17 10:07:07
如题
多谢
...全文
234
7
打赏
收藏
各位大侠能不能讲讲UDP校验和原理并给一份计算校验和的源程序
如题 多谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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);
}
ssmquicksetup-jvm-1.4.85-javadoc.jar
ssmquicksetup-jvm-1.4.85-javadoc.jar
wiser-unit-0.0.18-sources.jar
wiser-unit-0.0.18-sources.jar
pi-jvm-1.0.29-javadoc.jar
pi-jvm-1.0.29-javadoc.jar
fincast-0.0.50.jar
fincast-0.0.50.jar
austin-Java资源
austin-Java资源
网络编程
18,357
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章