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() 函数查找,返回...
PF_PACKET协议簇是用来取代SOCK_PACKET的一种编程接口。作为一种协议簇,它可以对应两种不同的套接字类型:SOCK_RAW和SOCK_DGRAM。当使用SOCK_RAW时,用户操作链路层数据,但是如果使用后者,则由系统处理链路层协议头。这种套接字支持四种协议(ETH_P_IP、ETH_P_ARP、ETH_P_RARP、ETH_P_ALL)(未确认) ...
若需发送数据,需要手动组装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.创建原始套接字 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. 使用`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))`来接收和发送以太网数据帧。这里...
2. socket(PF_PACKET, SOCK_RAW, htons(x)); 这个套接字比较强大,创建这种套接字可以监听网卡上的所有数据帧.从上面看就是20+20+8+100.最后一个以太网crc从来都不算进来的,因为内核已经判断过了,对程序来说没有任何意义了. 能: 接收发往本地mac的数据帧 ...