对于:
发送一个自定义的IP包。
发送ICMP数据报。
网卡的侦听模式,监听网络上的数据包。
伪装IP地址。
自定义协议的实现。
要解决这些问题,需要原始套接字。原始套接字主要应用在底层网络编程上。
原始套接字提供以下3种标准套接字不具备的功能。
使用原始套接字可以读/写ICMP、IGMP分组。例如ping程序,就使用原始套接字发送ICMP回显请求,并接受ICMP回显应答。用于多播的守护程序mrouted,同样适用原始套接字来发送和接收IGMP分组。
使用原始套接字可以读写特殊的IP数据报,内核不处理这些数据报的协议字段。大多数内核只处理1 (ICMP) 、2 (IGMP) 、3(TCP)和17 (UDP)的数据报。但协议字段还可能为其他值。例如, OSPF 路由协议就不适用TCP或者UDP,而直接使用IP,将IP数据报的协议字段设为89。因此,由于这些数据报包含内核完全不知道的协议字段,实现OSPF协议的gated程序必须使用原始套接字来读写
使用原始套接字,利用函数setsockopt()设置套接字选项,使用IP_HDRINGCL可以对IP头部进行操作,因此可以修改IP数据和IP层之上的各层数据,构造自己,的特定类型的TCP或者UDP的分组。
int rawsock = socket(AF_INET, SOCK_RAW, protocol);
protocol:
IPPROTO_IP: IP协议,接收或者发送IP数据包,包含IP头部。
IPPROTO_ICMP: ICMP协议,接收或者发送ICMP的数据包, IP的头部不需要处理。
IPPROTO_TCP: TCP协议,接收或者发送