学过socket基础编程的同学都知道,应用层socket(如使用SOCK_STREAM创建的TCP socket,SOCK_DGRAM创建的UDP socket)都只能收发应用层的数据,出于业务应用的需要,可能需要获取IP层的数据,这就需要用到socket接口中另一种更加强大的类型RAW socket。
使用SOCK_RAW创建的RAW socket,可以收发包含IP层的报文。其创建方法如下:
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
使用SOCK_RAW创建的RAW socket,可以收发包含IP层的报文。其创建方法如下:
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
其中IPPROTO_ICMP可以是其他协议类型,具体定义见linux/in.h:
/* Standard well-defined IP protocols. */
enum {
IPPROTO_IP = 0, /* Dummy protocol for TCP */
IPPROTO_ICMP = 1, /* Internet Control Message Protocol */
IPPROTO_IGMP = 2, /* Internet Group Management Protocol */
IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94) */
IPPROTO_TCP = 6, /* Transmission Control Protocol */
IPPROTO_EGP = 8, /* Exterior Gateway Protocol */
IPPROTO_PUP = 12, /* PUP protocol */
IPPROTO_UDP = 17, /* User Datagram Protocol */
IPPROTO_IDP = 22, /* XNS IDP protocol */
IPPROTO_DCCP = 33, /* Datagram Congestion Control Protocol */
IPPROTO_RSVP = 46, /* RSVP protocol */
IPPROTO_GRE = 47, /* Cisco GRE tunnels (rfc 1701,1702) */
IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling */
IPPROTO_ESP = 50, /* Encapsulation Security Payload protocol */
IPPROTO_AH = 51, /* Authentication Header protocol */
IPPROTO_BEETPH = 94, /* IP option pseudo header for BEET */
IPPROTO_PIM = 103, /* Protocol Independent Multicast */
IPPROTO_