0

我在理解 VLAN 标记时遇到问题。我已经使用 此链接对 /etc/network/interface 文件进行了更改, 我正在使用 C 语言在 Raspbian(Raspberry pi)上使用套接字编程。

我尝试了两种方法:

  1. C中的套接字是

    s = 套接字(AF_INET,SOCK_RAW,IPPROTO_RAW);

当我使用上述套接字从树莓派发送以太网数据包时,我只看到总线上传出的“arp”消息。

  1. s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))

但这会在发送数据包期间产生错误“sendto failed: Invalid argument”,发送数据包的代码是:

struct sockaddr_in sin; 
sin.sin_family = AF_PACKET;
sin.sin_port = htons(30490);
sin.sin_addr.s_addr = inet_addr(destination ip address);


if(sendto(socket, data, iph->tot_len, 0, (struct sockaddr *)&sin, sizeof(sin)) < 0)
{ perror("Sendto failed"); }
else { printf("Packet send"); }

任何人都可以帮助我提供有关如何在每个正在发送的数据包上附加 VLAN 标记的信息吗?或者我在上面的代码中做错了什么?

是否已经实现了用于发送带有 VLAN 的数据包的代码?

(在我的设置中,我没有使用任何路由器或交换机)

4

1 回答 1

2

VLAN 标记发生在以太网标头级别,而不是 IP 标头。如果尝试手动设置 VLAN 标签,您需要一个 AF_PACKET 套接字才能访问以太网标头。AFAIK,您不能使用 AF_INET 套接字修改以太网标头。

如果您要做的只是通过其他“正常”套接字发送带有 VLAN 标记的信息并让内核生成 VLAN 标记,那么您应该使用该链接中显示的说明,然后打开一个正常的套接字:

  • 绑定到您的 VLAN 虚拟以太网接口的本地地址
  • 连接到由于路由规则而将通过 VLAN 接口的外部主机。
于 2015-06-22T16:38:05.497 回答