一、报文格式
信息传递: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>
<