上QQ阅读APP看书,第一时间看更新
2.4 原始套接字的开发
本章最开始介绍了关于TCP和UDP的程序开发所使用的函数。使用TCP或UDP时,需要在调用socket()函数时为它的第2个参数指定相应的类型,比如SOCK_ STREAM是代表要使用TCP,而SOCK_DGRAM表示要使用UDP协议。除了可以指定这两种类型以外,还可以指定为原始套接字类型,即SOCK_RAW。当socket()函数的第2个参数指定为SOCK_STREAM或SOCK_DGRAM时,第3个参数可以缺省。而当socket()函数的第2个参数指定为SOCK_RAW时,第3个参数就必须明确指定需要使用的协议。
当套接字类型指定为SOCK_RAW时,协议类型的常用取值有IPPROTO_IP、IPPROTO_ICMP、IPPROTO_TCP、IPPROTO_UDP和IPPROTO_RAW。使用前四种类型,当发送数据时,系统会自动为数据加上IP首部并设置IP首部中的上层协议字段(如果有IP_HDRINCL选项,则系统不会自动添加IP首部);当接收数据时,系统不会将IP首部移除,需要程序自行处理。如果使用IPPROTO_RAW,那么系统将数据包直接送到网络层发送数据,并且需要程序自己构造IP首部中的字段。
本节通过介绍原始套接字实现经典的网络命令,即Ping命令。通过完成一个Ping命令来初步了解和掌握原始套接字的使用。