2010-07-21 36 views
1

我使用FriendlyARM與Linux 2.6.29,並與ARM-Linux的GCC 4.3.2 ARM-linux4.3.2,無法打開插座與PF_PACKET型

編譯時試圖打開與PF_PACKET插座它與協議不支持的errno 97,地址 系列失敗。

這是說明問題的例子程序 -

#include <stdio.h> 
#include <sys/socket.h> 
#include <netpacket/packet.h> 
#include <net/ethernet.h> 
//#include <linux/if_packet.h> 
//#include <linux/if_ether.h> 
#include <errno.h> 

    int main() { 
     int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETHER_TYPE)); 
     if (sockfd < 0) 
      perror("Can't open socket"); 
    } 

任何想法,爲什麼發生這種情況?

在此先感謝

奧倫

編輯: 事情我已經試過 -

  1. 確保我以root身份運行

  2. linux下的2.6編譯。 27.7-9-pae和一臺intel機器,在這臺機器下工作正常(gcc 4.4.1)

  3. 下面的帖子表明它與linux版本有關,但基於上述我認爲它可能是別的。 link text

+0

你把這作爲具有root用戶權限的用戶? – ognian 2010-07-21 08:58:27

+0

是的,我在設備上以root身份運行,euid爲0 – 2010-07-21 11:26:31

+0

errno設置了什麼? – 2010-07-21 21:10:53

回答

2

你已經CONFIG_PACKET你的內核配置定義?這是AF_PACKET所必需的。

+0

爲什麼,不...並且在運行不同版本的linux的舊設備中被定義。我會試一試並保持發佈。 謝謝! – 2010-07-22 07:16:17

+0

解決了它。 謝謝。 – 2010-07-22 17:08:27

0

如果能夠正常的鏈路層可以用PF_INET試試這樣做:

if((isock = socket(PF_INET, SOCK_RAW, htons(ETH_P_IP))) == -1){ 
     perror("socket():"); 
    } 

同樣的內核處理鏈路層。

或者與SOCK_DGRAM:

if((rsock = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) == -1){ 
     perror("socket():"); 
    }