原始套接字——发送UDP信息

本文详细介绍了如何构建从MAC头部到UDP头部的数据报文,包括设置MAC地址、IP头部信息、UDP头部及校验和,并提供了相应的C语言实现代码。整个过程涵盖了网络层和数据链路层的关键步骤,对于理解网络通信原理非常有帮助。
摘要由CSDN通过智能技术生成

一、报文格式

信息传递:ubuntu---->windows
在这里插入图片描述

二、组包

①组MAC报头
在这里插入图片描述

//1.组mac报文头部
struct ether_header *eth_addr = (struct ether_header *)msg;
//赋值mac地址
memcpy(eth_addr->ether_dhost, dst_mac, 6);
memcpy(eth_addr->ether_shost, src_mac, 6);
//赋值帧类型
eth_addr->ether_type = htons(0x0800);

②组IP报头
所在位置/usr/include/netinet/ip.h>
头文件#include <netinet/ip.h>
在这里插入图片描述
在结构体定义时,若成员类型为u_int16_t则为2个字节,需要用htons函数。

unsigned short checksum(unsigned short *buf, int len)
{
   
	int nword = len/2;
	unsigned long sum;
	
	if(len%2 == 1){
   
		nword++;
	}
	
	for(sum=0; nword>0; nword--){
   
		sum += *buf;
		buf++;
	}
	sum = (sum>>16) + (sum&0xffff);
	sum += (sum>>16);
	
	return ~sum;

}

//2.组IP报文头部
struct iphdr *ip_hdr = (struct iphdr *)(msg+14);	//跳过mac头部
ip_hdr->verson = 4;							//赋值版本(IPv4);
ip_hdr->ihl = 5;							//赋值首部长度,IP头部单位是4比特,所以赋值5相当于5*4=20字节
ip_hdr->tos = 0;							//赋值服务类型
ip_hdr->tot_len = htons(20+8+data_len);		//赋值总长度(IP首部长度+IP数据长度(UDP+data))
ip_hdr->id = htons(0);						//赋值标识
ip_hdr->frag_off = htons(0);				//赋值标识、片偏移
ip_hdr->ttl = 128;							//赋值生产时间
ip_hdr->protocol = 17;						//赋值协议(UDP:17 TCP:6)
ip_hdr->check = htons(0);					//赋值首部校验和(先写0,后续赋值)
memcpy(&ip_hdr->saddr,src_ip,4);			//赋值源IP
memcpy(&ip_hdr->daddr,dst_ip,4);			//赋值目的IP
	
//校验需要等赋值好再覆盖才有效果
ip_hdr->check = checksum(ip_hdr,20);		//赋值校验

③组UDP报头
所在位置/usr/include/netinet/udp.h><

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值