SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。 SOCK_DGRAM: 使用不连续不可靠的数据包连接。 SOCK_SEQPACKET: 提供连续可靠的数据包连接。 SOCK_RAW: 提供原始网络协议存取。 SOCK_RDM: 提供可靠的数据包连接。 SOCK_PACKET: 与网络驱动程序直接通信。 OOB: 在所有数据传送前必须使用connect()来建立连接状态。
int fd = socket (PF_PACKET, SOCK_RAW, IPPROTO_TCP); int fd = socket (PF_PACKET, SOCK_DGRAM, IPPROTO_TCP);
同理,你可能看见过别人这样写:socket(AF_INET, SOCK_RAW, IPPROTO_TCP); 实际上在FreeBSD 下用pffindproto 找,SOCK_RAW 与 IPPROTO_TCP 也是不匹配的,返回wildcard_RAW entry 。 再者,在FreeBSD 上这样调用 socket(AF_INET, SOCK_RAW, 0/* IPPRORO_IP*/); 是可以的,使用pffindtype() 函数查找,返回...
即创建原始套接字,调用recvfrom 接收数据,再调用processpacket 处理IP包,可以读出ip head 和 tcp head 各字段。 上述程序只可以接收tcp 包,当然udp 和 icmp 可以这样写: sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_UDP); sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_ICMP); ...
若需发送数据,需要手动组装TCP、UDP、ICMP等头部信息。可以使用setsockopt函数自定义IP头部。这种套接字适用于编写ping程序。相比之下,socket(PF_PACKET, SOCK_RAW, htons(x))创建的套接字更为强大。它能够监听所有网卡上的数据帧。该套接字接收发往本地MAC地址的数据帧,接收本地发送出去的数据帧,...
PF_PACKET协议簇是用来取代SOCK_PACKET的一种编程接口。作为一种协议簇,它可以对应两种不同的套接字类型:SOCK_RAW和SOCK_DGRAM。当使用SOCK_RAW时,用户操作链路层数据,但是如果使用后者,则由系统处理链路层协议头。这种套接字支持四种协议(ETH_P_IP、ETH_P_ARP、ETH_P_RARP、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))`来接收和发送以太网数据帧。这里...
1.创建原始套接字 int sock_raw_fd = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL)); if(sock_raw_fd < 0) { perror("socket"); exit(-1); } 2.定义接收缓冲区 unsigned char buf[1024]=""; 3.储存源目的MAC地址缓冲区 unsigned char src_mac[18]=""; ...
我们一起来看看程序1,我们打开一个属于PF_PACKET-family 协议簇的SOCKET,指定一个SOCK_RAW socket类型和IP相关协议类型。这时我们开始从SOCKET抓包,在一些相关检查后.我们开始得到从链路层和IP层抓来的头部信息,。通过阅读程序一,你将会发现让应用程序从网络层抓包其实并不难!