计算udp校验和例子_UDP 包校验和计算

可以参考一下我的代码:

//校验

USHORT checksum(USHORT* buff, INT size)

{

ULONG cksum = 0;

while(size>1)

{

cksum += *buff++;

size -= sizeof(USHORT);

}

// 是奇数

if(size)

{

cksum += *(UCHAR*)buff;

}

// 将位的chsum高位和低位相加,然后取反

cksum = (cksum >> 16) + (cksum & 0xffff);

cksum += (cksum >> 16);

return (USHORT)(~cksum);

}

//修改数包窗口大小,以及清除标志位

void ModifyPacketWndSize(PVOID pPacketContent,INT iPacketSize)

{

//定义数据包tcp/ip结构指针

int            nLeavingLen;

PETHeader    pEtherHdr=NULL;

PIPHeader    pIpHdr=NULL;

PTCPHeader    pTcpHdr=NULL;

PUDPHeader    pUdpHdr=NULL;

CHAR        *pData=NULL;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDP校验计算方法比较简单,下面是一个计算UDP校验和的例子: ```python import socket import struct def checksum(data): # 如果数据长度为奇数,补一个字节的0 if len(data) % 2 != 0: data += b'\x00' # 将数据按每两个字节一组进行分组 words = struct.unpack('>' + 'H' * (len(data) // 2), data) # 将所有的16位的数相加 total = sum(words) # 将进位的16位加回到低16位 total = (total >> 16) + (total & 0xffff) # 取反得到校验和 checksum = (~total) & 0xffff return checksum # 构造UDP数据 src_ip = '192.168.0.1' dst_ip = '192.168.0.2' src_port = 12345 dst_port = 54321 data = b'Hello, world!' # 构造UDP头部 udp_header = struct.pack('!HHHH', src_port, dst_port, len(data) + 8, 0x0000) # 计算校验和 pseudo_header = struct.pack('!4s4sBBH', socket.inet_aton(src_ip), socket.inet_aton(dst_ip), 0x00, socket.IPPROTO_UDP, len(udp_header) + len(data)) checksum_data = pseudo_header + udp_header + data udp_checksum = checksum(checksum_data) # 构造完整的UDP数据 udp_packet = udp_header + struct.pack('!H', udp_checksum) + data # 打印UDP数据的十六进制表示 print('UDP packet:', udp_packet.hex()) ``` 这个例子中,我们先构造了一个UDP数据,然后计算了它的校验和。计算校验和的过程分为以下几步: 1. 将数据按每两个字节一组进行分组。 2. 将所有的16位的数相加。 3. 将进位的16位加回到低16位。 4. 取反得到校验和。 需要注意的是,计算校验和时,需要先构造一个伪头部,伪头部中含源IP地址、目的IP地址、协议号和UDP头部+数据的长度,然后将伪头部、UDP头部和数据拼接起来,计算校验和。这是因为UDP校验和不仅要校验UDP头部和数据,还要校验IP头部和UDP伪头部。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值