1.用字符串指针做为发送缓冲区和接收缓冲区的指针;
2.icmp报文类型结构体可自行定义,也可用<netinet/ip_icmp.h>中定义好的strcut icmp结构体;
3.ip_hl*4表示ip头部长度;
4.剥离头部的含义:让数据部分的指针指向数据部分,找到数据部分所在的内存地址;
5.原始套接字的接收:对于某个协议的原始套接字,若不进行其他额外的操作,则此原始套接字会接收所有发向本机的数据部分为其协议类型的IP数据包,若调用connect(),则此套接字只接收与其连接的那个IP发来的IP数据报。
6.原始套接字面向IP层,因此对于原始套接字来说没有端口这个概念,对于某个进程创建的原始套接字,无法保证其收到的数据是发向其所在的进程的,需要根据收到的报文包的某个字段与进程id相比较来判断此报文是否是发向其所在进程的;
7.注意sin_addr是个结构体类型,不能将ip值以sockaddr_in.sin_addr=ip形式进行赋值,正确赋值方式:sockaddr_in.sin_addr.s_addr=ip;
8.只有root身份才能创建原始套接字;
9.调用库函数之后,要根据其返回值判断函数是否调用成功,若失败则输出错误信息并退出程序;
10.char *p="icmp";sizeof(p)表示指针类型的长度而非“icmp“的字节数;
11.vim下,每个输出后都要加一个 ;