前面写的一篇《Linux下如何在数据链路层接收原始数据包》举了一个实例,使用raw socket接收UDP数据报,但是发送一个数据包比接收要复杂一些,本文以一个实例说明如何使用raw socket发送一个UDP报文。
1. 前言
- 阅读本文前可以考虑先阅读一下我的另外一篇文章《Linux下如何在数据链路层接收原始数据包》,那篇文章中已经介绍过的一些概念,本文中将不再赘述;下面仅罗列一些曾经在《Linux下如何在数据链路层接收原始数据包》介绍过的技术要点;
- 发送数据时打开raw_socket
sock_raw = socket(AF_PACKET, SOCK_RAW, IPPROTO_RAW); if (sock_raw == -1)printf("error in socket");
- 以太网报头结构(定义在头文件linux/if_ether.h中)
struct ethhdr {unsigned char h_dest[ETH_ALEN]; /* destination eth addr */unsigned char h_source[ETH_ALEN]; /* source ether addr */__be16 h_proto; /* packet type ID field */ } __attribute__((packed));
- IP报头结构(定义在头文件linux