原始套接字

raw socket,

原始套接字工作原理与规则

以下 ???

int sockfd;
sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);

这两句程序你就可以创建一个原始套接字。然而这种类型套接字的功能却与 TCP 或者 UDP 类型套接字的功能有很大的不同:TCP/UDP 类型的套接字只能够访问传输层以及传输层以上的数据,因为当 IP 层把数据传递给传输层时,下层的数据包头已经被丢掉了。而原始套接字却可以访问传输层以下的数据,所以使用 raw 套接字你可以实现上至应用层的数据操作,也可以实现下至链路层的数据操作。

sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));

通过这种方式创建的 raw socket 就能直接读取链路层的数据

参考

利用AF_PACKET 套接字发送一个任意的以太网帧

arp程序 AF_INET和AF_PACKET区别