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))发送接收以太网数据帧 3.socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))过时了,不要用啊 理解一下SOCK_RAW的...
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))发送接收以太网数据帧 参考了以下文章的代码。 源码:https://blog.csdn.net/luchengtao11/article/details/73878760 #include <unistd.h> #in...
sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6)); memset(&sl, 0x00, sizeof(sl)); memset(&ifr, 0x00, sizeof(ifr)); sl.sll_family = AF_PACKET; sl.sll_protocol = htons(ETH_P_IPV6); strncpy(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name)); ioctl(fd, SIOCGIFINDEX, &if...
原始套接字,即raw socket,可以接收本机网卡上的数据帧或者数据包,对与监听网络的流量和分析是很有作用的.一共可以有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))发...
使用AF_INET,用户程序无法获得链路层数据,也即,以太网头部。简单来说,使用AF_INET,是面向IP层的原始套接字;使用AF_PACKET,是面向链路层的套接字。 Type就是socket的类型,对于AF_INET协议族而言有流套接字(SOCK_STREAM)、数据包套接字(SOCK_DGRAM)、原始套接字(SOCK_RAW)。
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IP)) 这样该socket就可以读取到所有的数据包。当然这样的数据包无疑是非常庞大的,那么我们可以 使用bind和connect来过滤数据包。bind可以指定本地的IP和端口,connect可以指定对端的IP和端口。 2. 在修改完创建socket的API,我发现还有一个问题,到现在依然没有找到...
fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); /* newer systems */ 这样将会接收到数据链路层所有协议帧;如果我们只需要IPv4帧,可以这样写: fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)); /* new systems */ 或者 fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_IP)); /...
(1)使用AF_INET协议族中SOCK_PACKET类型的套接字 SOCK_PACKET是Linux支持的一种socket类型,可以通过这种套接字来访问数据链路层,与BPF、DLPI类似。 这种方法要求程序员自己封装ARP包,包括链路层的以太网首部。ARP包的发送和接收与IP层的发送接收类似,不过sockaddr要配置成本地的硬件地址。就像是我们把含以太...
socket(PF_PACKET, SOCK_RAW|SOCK_DGRAM, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL)) 发送接收以太网数据帧这种套接字比较强大,可以监听网卡上的所有数据帧 能: 接收发往本地mac的数据帧 能: 接收从本机发送出去的数据帧(第3个参数需要设置为ETH_P_ALL) 能: 接收非发往本地mac的数据帧(网卡需要设置为pr...