使用C Socket发送带有VLAN标记的数据包

时间:2015-06-22 16:26:37

标签: c sockets ethernet raspbian vlan

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

我尝试了两种方法:

  1. C中的套接字是

    s = socket(AF_INET,SOCK_RAW,IPPROTO_RAW);

  2. 当我使用上面的套接字发送来自覆盆子pi的以太网数据包时,我只能看到传出的" arp"公交车上的消息。

    1. s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
    2. 但这会产生错误" sendto failed:无效的参数"在发送数据包时,发送数据包的代码是:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

  • 绑定到VLAN虚拟以太网接口的本地地址
  • 由于路由规则而连接到将通过VLAN接口的外部主机。