使用C套接字发送带VLAN标记的数据包
问题描述:
我在理解VLAN标记时遇到问题。 我已经使用this link 在/ etc/network/interface文件中做了更改我正在使用C语言在Raspbian(Raspberry Pi)上使用套接字编程。使用C套接字发送带VLAN标记的数据包
我试图2种方法:
-
在C中的插座是
S =插座(AF_INET,SOCK_RAW,IPPROTO_RAW);
当我使用上面的套接字从树莓派发送以太网数据包时,我只能看到总线上传出的“arp”消息。
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
但是这产生一个错误 “SENDTO失败:无效参数” 发送分组时,发送数据包中的代码是:
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_PACKET套接字才能访问以太网报头。 AFAIK,你不能用AF_INET套接字修改以太网头。
如果您要做的只是通过其他“正常”套接字发送带VLAN标记的信息,并让内核生成VLAN标记,则应该只使用该链接中显示的指令,然后打开一个普通套接字, :
- 结合你的VLAN虚拟以太网接口的本地地址
- 或连接到外部主机将通过VLAN接口由于路由规则。
我编辑了我的问题。你能告诉我为什么会出现错误? – Praj