在一般的套接字编程中,我们只能读取内核给我们加工以后的IP数据包,并不能直接读取和修改原始的IP数据包,如果我们要修改原始的IP数据包,那么我们就需要原始套接字来接收数据包.
创建原始套接字
int socket(AF_INET, SOCK_RAW, protocol);
这个函数在前面已经介绍过了,这个函数也可以用来创建原始套接字,前面两个参数是一样的,就是最后的一个参数,常见的参数有IPPROTO_TCP(原始TCP套接字),IPPROTO_UDP(原始UDP套接字),IPPROTO_ICMP(原始ICMP套接字)
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen); //发送数据函数
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen); //接收数据的函数
哪几种情况内核会将接收到的IP数据报文传递给原始套接字:
1、接收到的TCP和UDP绝不传递到任何套接字
2、ICMP分组会在内核处理完其中的ICMP消息之后传递到原始套接字
3、IGMP分组同上
4、内核不认识其协议字段的IP数据报
注意:必须在管理员权限下才能使用原始套接字