2015-06-22 37 views
0

我在理解VLAN标记时遇到问题。 我已经使用this link 在/ etc/network/interface文件中做了更改我正在使用C语言在Raspbian(Raspberry Pi)上使用套接字编程。使用C套接字发送带VLAN标记的数据包

我试图2种方法:

  1. 在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的数据包?

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

    回答

    2

    VLAN标记出现在以太网头的水平,而不是IP报头。如果尝试手动设置VLAN标记,则需要一个AF_PACKET套接字才能访问以太网报头。 AFAIK,你不能用AF_INET套接字修改以太网头。

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

    • 结合你的VLAN虚拟以太网接口的本地地址
    • 连接到外部主机将通过VLAN接口由于路由规则。
    +0

    我编辑了我的问题。你能告诉我为什么会出现错误? – Praj