2011-11-11 33 views
0

我正在使用c中的原始以太網編程。我有兩個文件客戶端和服務器在本地主機上運行。我在socket()中使用自己的協議號進行通信。本地主機上的原始以太網PF_PACKET問題

在客戶端,我已經follwing代碼

s = socket(PF_PACKET, SOCK_RAW, 61187); 
    unsigned char dest_mac[6]= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; 
    struct sockaddr_ll socket_address; 

     socket_address.sll_family = PF_PACKET; 
     socket_address.sll_protocol = 61187; 
     socket_address.sll_ifindex = ifindex; 
     socket_address.sll_hatype = ARPHRD_ETHER; 
     socket_address.sll_pkttype = PACKET_BROADCAST; 
     socket_address.sll_halen = ETH_ALEN; 
     socket_address.sll_addr[0] = dest_mac[0]; 
     socket_address.sll_addr[1] = dest_mac[1]; 
     socket_address.sll_addr[2] = dest_mac[2]; 
     socket_address.sll_addr[3] = dest_mac[3]; 
     socket_address.sll_addr[4] = dest_mac[4]; 
     socket_address.sll_addr[5] = dest_mac[5]; 
     socket_address.sll_addr[6] = 0x00; 
     socket_address.sll_addr[7] = 0x00; 

,然後我發送一些數據如下

sent = sendto(s, buffer, ETH_HEADER_LEN, 0, (struct sockaddr*)&socket_address, sizeof(socket_address)); 

在服務器端,我做的socket建立在客戶端和我在做什麼recvfrom的如下

length = recvfrom(s, buffer, BUF_SIZE, 0, NULL, NULL); 

但我沒有收到服務器端的任何數據包。任何人都可以讓我知道問題是什麼?

回答

0

從你的不完整的例子很難說,但我會懷疑你使用SOCK_RAW你想要使用SOCK_DGRAM。在您的SOCK_RAW中,以太網報頭被假定爲您指定的buffer的一部分,即您的目標地址設置與數據包的內容無關。使用SOCK_DGRAM時,buffer的內容形成生成的以太網幀的有效負載,並且標頭來自您的地址字段。

當您在測試時讓tcpdump -neX(或與Wireshark或tshark等效的設備)運行時,您可以很容易地進行調試 - 您將看到您正在生成的數據包。