有什么方法可以接收特定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接口(interface)并将原始套接字绑定(bind)到该接口(interface)。现在我可以发送802.3帧,内核将插入/提取VLAN标签。

  • 创建VLAN接口(interface),您应该具有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
    
  • 在应用程序中使用普通绑定(bind)功能绑定(bind)到VLAN接口(interface)。在上面的示例中,eth0.100。

  • 您可以引用以下两个链接获取示例代码(我是代码所有者不是)

    发送:https://gist.github.com/austinmarton/1922600

    接收:https://gist.github.com/austinmarton/2862515#file-recvraweth-c

    唯一需要做的更改是绑定(bind)到虚拟VLAN接口(interface),而不是绑定(bind)到物理接口(interface)。请注意,接收到的以太网帧是未标记的帧。在该接口(interface)上发送的所有帧都将自动标记为VLANID。

    关于linux - 在Linux下读取具有特定VLAN标记的802.1Q帧,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21825058/

    10-09 02:13