Closed. This question needs details or clarity. It is not currently accepting answers. Learn more
想改进这个问题吗?添加细节并通过editing this post澄清问题。
四年前关闭。
我有一个问题,以了解VLAN标记。
我已经使用this link更改了/etc/network/interface文件
我用C语言在Raspbian(Raspberry pi)上使用socket编程。
我尝试了两种方法:
C中的插座是
s=插座(AF_INET、SOCK_RAW、IPPROTO_RAW);
当我使用上述套接字从树莓pi发送以太网数据包时,我只看到总线上传出的“arp”消息。
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
但这会在发送数据包期间创建错误“send to 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标记发生在以太网报头级别,而不是IP报头级别。如果尝试手动设置VLAN标记,则需要一个AF U数据包套接字来访问以太网报头。AFAIK,不能用AF_INET套接字修改以太网头。
如果您要做的只是通过一个“普通”套接字发送VLAN标记的信息,并让内核生成VLAN标记,那么您应该只使用该链接中显示的指令,然后打开一个普通套接字,该套接字可以:
绑定到VLAN虚拟以太网接口的本地地址
或连接到外部主机,该主机将根据路由规则通过VLAN接口。

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

10-12 01:22