// 所需头文件#include <sys/socket.h> #include <netinet/ether.h> #include <stdio.h> // perror int main(int argc,char *argv[]) { int sock_raw_fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) ); if(sock_raw_fd < 0){ perror("socket"); return -1; } return 0; } 获取...
1.socket(PF_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))发送接收以太网数据帧 3.socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧(不包括以太网头部...
intsock = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));if(sock <0) { perror("sock");return-1; } 在Linux系统中,使用socket函数创建原始套接字(raw socket)时,可以捕获和发送任意类型的网络数据包。以下是socket函数调用socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));中各个参数的说明: 1.PF_...
1.socket(PF_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))发送接收以太网数据帧 3.socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))发送接收以太网数据帧(不包括以太网头部...
对于原始套接字,domain(family)套接字族可以是AF_INET、PF_INET、AF_PACKET和PF_PACKET;套接字类型是SOCK_RAW;至于协议,可以查阅if_ether.h头文件。 因此,可以看到使用各种参数的组合来创建原始套接字。这也是学习raw socket的时候很容易混淆的一点。
int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // 创建Socket struct sockaddr_ll sll; // 注意结构体是sockaddr_ll memset( &sll, 0, sizeof(sll) );sll.sll_family = AF_PACKET;struct ifreq ifstruct;strcpy(ifstruct.ifr_name, "eth0");ioctl(sockfd, SIOCGIFINDEX, &ifstruct...
我们一起来看看程序1,我们打开一个属于PF_PACKET-family 协议簇的SOCKET,指定一个SOCK_RAW socket类型和IP相关协议类型。这时我们开始从SOCKET抓包,在一些相关检查后.我们开始得到从链路层和IP层抓来的头部信息,。通过阅读程序一,你将会发现让应用程序从网络层抓包其实并不难!
相比之下,socket(PF_PACKET, SOCK_RAW, htons(x))创建的套接字更为强大。它能够监听所有网卡上的数据帧。该套接字接收发往本地MAC地址的数据帧,接收本地发送出去的数据帧,并在网卡设置为混杂模式时,接收非发往本地MAC的数据帧。协议类型共有四个:ETH_P_IP接收发往本地MAC的IP类型数据帧,...
原始套接字接收流程包括:根据报文的L4层协议类型生成hash值,从raw_v4_htable中查找对应的raw socket,然后调用raw_v4_input()处理网络层原始套接字。如果使用AF_PACKET,则原始套接字面向链路层,适用于接收和发送以太网数据包。实现自己的ping程序是学习使用原始套接字的一个好例子。首先明确ping使用...