c - 使用 C 套接字发送带有 VLAN 标记的数据包

标签 c sockets ethernet raspbian vlan

<分区>

我无法理解 VLAN 标记。 我已经使用 this link 对/etc/network/interface 文件进行了更改。 我正在使用 C 语言在 Raspbian (Raspberry pi) 上使用套接字编程。

我尝试了两种方法:

  1. C中的socket是

    s = socket(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 发送数据包的代码?

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

最佳答案

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

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

  • 绑定(bind)到您的 VLAN 虚拟以太网接口(interface)的本地地址
  • 连接到根据路由规则将通过 VLAN 接口(interface)的外部主机。

关于c - 使用 C 套接字发送带有 VLAN 标记的数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30985125/

相关文章:

c - argv[0] 什么时候可以为空?

c - 在数组声明中使用乘法宏

c - 如何更改已编译二进制文件的 lib 版本

c++ - 用 recv() 接收部分数据,这可能吗?

java - 如何在 Windows 上检测以太网电缆是否与 Java 连接

Char数据类型算术表达式

在 netstat 或 lsof 命令中看不到我正在运行的进程?

c - 对 send() 的多次调用合并为对 recv() 的一次调用

linux - 使用 ifconfig 更改网络接口(interface)的 MAC 地址如何影响未处于混杂模式的 NIC?

android - Android 实际上在哪里调用 "ip link"或 "ifconfig"来启动界面?