原始套接字

Posted 嵌入式的学习之旅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原始套接字相关的知识,希望对你有一定的参考价值。

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

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

以上是关于原始套接字的主要内容,如果未能解决你的问题,请参考以下文章

原始套接字

Linux Socket 原始套接字编程

原始套接字编程

原始套接字

原始套接字

python使用原始套接字 解析原始ip头数据