原始套接字

在一般的套接字编程中,我们只能读取内核给我们加工以后的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数据报

 注意:必须在管理员权限下才能使用原始套接字

原文地址:https://www.cnblogs.com/CHYI1/p/5515462.html