2015-06-22 46 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