在这篇博客中,作者用AF_PACKET+SOCK_RAW的原始套接字在数据链路层模拟了一个地址解析协议的操作(Address Resolution Protocol),其中作者没有使用繁杂的包数据结构去构造发送数据,转而使用了直接赋值的方式,非常直观与暴力,可以对着wireshark的数据来构造自己的数据包,非常便于理解与学习,所以我自己模仿了一个PING操作,...
import socket import struct import os # 创建原始套接字 sock_raw = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.IPPROTO_RAW) # 设置套接字选项以包含IP头(注意:这取决于操作系统和Python版本,可能需要调整) # 对于Linux,通常不需要显式设置IP_HDRINCL,因为AF_PACKET已经包含了链路层头 # 但...
linux sock_raw原始套接字编程[zz] 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_...
若需发送数据,需要手动组装TCP、UDP、ICMP等头部信息。可以使用setsockopt函数自定义IP头部。这种套接字适用于编写ping程序。相比之下,socket(PF_PACKET, SOCK_RAW, htons(x))创建的套接字更为强大。它能够监听所有网卡上的数据帧。该套接字接收发往本地MAC地址的数据帧,接收本地发送出去的数据帧,...
#define PF_INET AF_INET #define AF_PACKET PF_PACKET /* ... */ type:指定socket类型(type) C++ Code 1 2 3 4 5 6 7 8 9 10 enum sock_type { SOCK_STREAM =1, SOCK_DGRAM =2, SOCK_RAW =3, SOCK_RDM =4, SOCK_SEQPACKET =5, ...
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))发...
1. 使用`socket(AF_INET, SOCK_RAW, IPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP)`来接收和发送IP数据包。需要注意的是,不能使用`IPPROTO_IP`,因为系统无法识别使用此协议的数据包。2. 使用`socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP|ETH_P_ARP|ETH_P_ALL))`来接收和发送以太网数据帧。这里...
发送接收ip数据包,不能用IPPROTO_IP,因为如果是用了IPPROTO_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))过时了,不要用啊 ...
int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); struct sockaddr_ll sll; memset( &sll, 0, sizeof(sll) ); sll.sll_family = AF_PACKET; struct ifreq ifstruct; strcpy(ifstruct.ifr_name, "eth0"); ioctl(sockfd, SIOCGIFINDEX, &ifstruct); ...