首先来说,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。总体来说,SOCK_RAW可以处理普通的网络报文之外,还可以处理一些特殊协议报文以及操作IP层及其以上的数据。 原始套接字可以用来自行组装IP...
通过PF_INET可以构造原始套接字,如下所示: intfd=socket(PF_INET,SOCK_RAW,IPPROTO_TCP); 1. 正如前面所讲的,它工作在IP层及其以上各层协议上(当然是在使用IP_HDRINCL选项之后才能操作IP层数据啦),但是这种套接字无法接收从本地发送出去的报文。而使用SOCK_PACKET类型的套接字,则可以操作链路层数据了: intfd...
SOCK_DGRAM: 数据报套接口,无连接,使用UDP协议 传送的数据格式是预先定义好的 通过原始套接字,可以了解底层协议的实现细节,自己构造协议首部和数据,发送并接受 WinSock提供了另一种类型的套接口SOCK_RAW,也被称为“原始套接口”。 当用选项IP_HDRINCL调用setsockopt时,用户可以自己构造IPv4首部。 创建套接口时设置一...
原始套接字SOCK_RAW 实际上,我们常用的网络编程都是在应用层的报文的收发操作,也就是大多数程序员接触到的流式套接字(SOCK_STREAM)和数据包式套接字(SOCK_DGRAM)。而这些数据包都是由系统提供的协议栈实现,用户只需要填充应用层报文即可,由系统完成底层报文头的填充并发送。然而在某些情况下需要执行更底层的操作...
既然SOCK_RAW有以上特性,所以在某些处理流程上它区别于普通套接字。 · 若设置IP_HDRINCL选项,SOCK_RAW可以操作IP头数据(也就是用户需用填充IP头及其以上的payload);否则SOCK_RAW无法操作IP头数据 · 端口对于SOCK_RAW而言没有任何意义 · 如果使用bind函数绑定本地IP,那么如果IP_HDRINCL未设置,则用此IP填充源IP...
if(sock_raw_fd < 0) { perror("socket"); exit(-1); } 2.定义接收缓冲区 unsigned char buf[1024]=""; 3.储存源目的MAC地址缓冲区 unsigned char src_mac[18]=""; unsigned char dst_mac[18]=""; //从网卡直接接收数据包 int ret = recvfrom(sock_raw_fd,buf,sizeof(buf),0,NULL,NULL)...
sock_raw,即原始套接字(Raw Socket),是一种特殊类型的套接字,允许用户程序直接对IP数据包进行操作,而不需要经过传输层的封装(如TCP或UDP)。使用原始套接字,可以发送和接收自定义的IP数据包,包括IP头部和可选的IP选项。阐述在何种场景下会使用sock_raw: ...
sock_raw原始套接字编程可以接收到本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有3种方式创建这种socket 1.socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)发送接收ip数据包 2.socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发...
一、SOCK_RAW 内幕 首先在讲SOCK_RAW 之前,先来看创建socket 的函数: int socket(int domain, int type, int protocol); domain :指定通信协议族(protocol family/address) /usr/include/i386-linux-gnu/bits/socket.h C++ Code 1 2 3 4 5 6