EE402-Lab4_Q7

该内容涉及EE402实验的Q7,主要讨论如何通过Wireshark检查UDP头部的校验和。当理论校验和与抓包得到的不一致时,表明数据可能存在错误。内容指出,UDP头的d87a字段用于校验,原始代码将其设为0x00,0x00。此外,UDP头之前是源和目的IP地址,其后是数据段。" 121090514,9933588,Docker入门详解,"['Docker', '容器技术', '运维', '虚拟化', 'Linux']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q7

#include <stdio.h>
typedef unsigned short u16;

#define BSWAP_16(x) \
(u16) ( ((((u16)(x) & 0x00ff)) << 8) \
	| (((u16)(x) & 0xff00) >> 8) )
u16 bswap_16(u16 x)
{
	return ((x & 0x00ff) << 8) | ((x & 0xff00) >> 8);
} 

unsigned short check_sum(unsigned short *a, int len)
{
	unsigned int sum = 0;
	
	while (len > 1) {
		sum += *a++;
		len -= 2;
	}
	
	if (len) {
		sum += *(unsigned char *)a;
	}
	
	while (sum >> 16) {
		sum = (sum >> 16) + (sum & 0xffff);
	}
	
	return (unsigned short)(~sum);
}

int main()
{
	unsigned short sum;
	unsigned char
	buffer[] = {0xc0,0xa8,0x2b,0xea,0xc0,0xa8,0x2b,0x01,0x00,0x11,0x00,0x2d,\ // message pseudo header
		0xc2,0x00,0x00,0x35,0x00,0x2d,0x00,0x00,\  // UDP header
		// data segment
		0xd3,0x04,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x61,\
		0x70,0x70,0x68,0x75,0x62,0x05,0x71,0x7a,0x6f,0x6e,0x65,0x02,0x71,0x71,0x03,0x63,0x6f,0x6d,0x00,0x00,0x01,0x00,0x01};	

	sum = check_sum((unsigned short*)buffer, sizeof(buffer));

	u16 num_16 = sum;
	printf("IP CheckSum:%x\n", bswap_16(num_16));
	printf("IP CheckSum:%x\n", BSWAP_16(num_16));
	return 0;
}

输出的就是检验后理论上的checksum,和你抓取的checksum不符就说明数据有误。
在这里插入图片描述

蓝色部分是UDP header,最后的d87a是待验证的checksum,代码中统一为0x00,0x00。蓝色部分后的全是data segment。蓝色部分前8对,是source IP和destination IP。

  • PS:借鉴的童鞋改改变量名以防查重。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数学:人类精神虐待(゚Д゚)ノ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值