使用raw socket发送报文比接收报文要复杂一些,因为需要在程序中构建数据链路层、网络层和传输层的报头,本文以发送UDP报文为例说明在使用raw socket时如何构建数据链路层、网络层和传输层的报头并发送报文,文中给出了完整的源程序;本文假定读者掌握了基本的IPv4下的socket编程。
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中)