PF_PACKET和AF_PACKET的不同

首先查看一下源代码
shell#>vim /usr/include/bits/socket.h


line 62 /* Protocol families.  */
line 83 #define PF_PACKET   17  /* Packet family.  */


line 94 /* Address families.  */
line115 #define AF_PACKET   PF_PACKET

看来数值上是相等的,都是 0x0011。不同之处是,一个代表协议族,一个代表地址族。

可以使用PF_PACKET和SOCK_DGRAM发送VLAN。在Linux系统中,可以使用socket API创建一个PF_PACKET类型的socket,并在发送数据时使用SOCK_DGRAM类型。在发送数据包时,需要将VLAN标签添加到数据包的头部。可以使用struct vlanhdr结构体来构建VLAN标签。以下是一个示例代码片段,演示了如何使用PF_PACKET和SOCK_DGRAM发送带有VLAN标签的数据包: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <linux/if_packet.h> #include <linux/if_ether.h> #include <linux/if_vlan.h> #include <net/if.h> #define ETH_P_8021Q 0x8100 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_ll dest_addr; char *iface; unsigned char src_mac[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}; unsigned char dst_mac[6] = {0x00, 0x66, 0x77, 0x88, 0x99, 0xaa}; unsigned short vlan_tag = 100; // 创建PF_PACKET类型的socket if ((sockfd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_8021Q))) < 0) { perror("socket create error"); exit(1); } // 设置目标MAC地址 memset(&dest_addr, 0, sizeof(struct sockaddr_ll)); dest_addr.sll_family = AF_PACKET; dest_addr.sll_protocol = htons(ETH_P_8021Q); dest_addr.sll_halen = ETH_ALEN; dest_addr.sll_ifindex = if_nametoindex(iface); memcpy(dest_addr.sll_addr, dst_mac, 6); // 构造VLAN标签 struct vlanhdr vlan; vlan.h_vlan_TCI = htons(vlan_tag); vlan.h_vlan_encapsulated_proto = htons(ETH_P_IP); // 构造数据包 char payload[] = "hello world"; char packet[ETH_FRAME_LEN]; memcpy(packet, dst_mac, 6); memcpy(packet + 6, src_mac, 6); memcpy(packet + 12, &vlan, sizeof(struct vlanhdr)); memcpy(packet + 16, payload, strlen(payload)); // 发送数据包 if (sendto(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_ll)) < 0) { perror("sendto error"); exit(1); } close(sockfd); return 0; } ``` 请注意,该示例代码中的iface变量需要设置为发送接口的名称,例如eth0。在发送数据包时,可以使用sendto函数将数据包发送到目标MAC地址。在构造数据包时,需要按照以下顺序填充数据包的头部:目标MAC地址、源MAC地址、VLAN标签、有效载荷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值