有没有办法接收特定 VLAN 标记帧的数据?目前,我通过将 htons(0x22f0) 作为 socket() 函数的输入来接收所有 VLAN 标记的帧,例如:
m_iSocketDesc = socket(AF_PACKET, SOCK_RAW, htons(0x22f0));
numBytes = recvfrom(m_iSocketDesc, message_data, 1522, 0, NULL, 0)
我有类似的要求。为了接收具有特定 VLAN 的数据包,我创建了一个 VLAN 接口并将我的原始套接字绑定到它。现在我可以发送 802.3 帧,内核插入/提取 VLAN 标签。
创建一个VLAN接口,你应该有root权限
ip link add link <phyInterface> name <phyInterface.VLANID> type vlan id VLANID
Eg: ip link add link eth0 name eth0.100 type vlan 100
在您的应用程序中使用普通绑定功能绑定到 VLAN 接口。在上面的例子中是 eth0.100。
您可以参考以下两个链接获取示例代码(我不是代码的所有者)
发送:https ://gist.github.com/austinmarton/1922600
接收:https ://gist.github.com/austinmarton/2862515#file-recvraweth-c
唯一需要的更改是绑定到虚拟 VLAN 接口,而不是绑定到物理接口。请注意,接收到的以太网帧是未标记的帧。在此接口上发送的任何帧都将自动标记 VLANID。