UDP校验和 谁有计算UDP校验和的代码发出来参考下 谢谢了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://topic.csdn.net/t/20050301/21/3816586.html 以下是我的源代码, //////////////////////////////////////////////////////////////////// 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); } 怎么获取他人程序的string table值呀 关闭MessageBox弹出的消息框 在Win2000下,利用VC如何获得网卡的设备路径 如何知道系统现在选中的内容? 画波形图时如何实现800个像素表示10000个点的值? 请问哪里有数据库绑定的list? 重绘问题--基于dialog 获得文件所在文件夹的全路径 如何改变TREEVIEW里面的位图的底色 winsock进行有连接的通讯编程的问题,请大虾帮忙 不按规矩放分,要严重BS刚上任的某版主!!! 如何获取ShellExecute打开程序的主窗口hwnd
////////////////////////////////////////////////////////////////////
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);
}