2017-01-08 7 views
1

私はOS XのCで簡単なスニファを書いています 私は問題があります。ネットワークインタフェースのインデックスを取得できません。識別子 'SIOCGIFINDEX' は宣言されていないですネットワークインタフェースのインデックスを取得

int sockfd=socket(PF_INET, SOCK_DGRAM, 0); 
    if(sockfd<0) 
    { 
    printf("create socket"); 
    fprintf(stderr, "%s\n",strerror(errno)); 
    exit(EXIT_FAILURE); 
    } 
    sprintf(ifreq.ifr_name, "%s", "en0"); 
    if(ioctl(sockfd, SIOCGIFINDEX, &ifreq)<0) 
    { 
    fprintf(stderr, "%s\n",strerror(errno)); 
    exit(EXIT_FAILURE); 
    } 

問題: 私はこのコードを使用します。 正しく理解していれば、構造化されたsockaddr_llのネットワークインターフェイスのインデックスが必要です

+0

'#include 'をプログラムに含めましたか? – hmofrad

+0

はい、私はこのヘッダを含め – Anton

答えて

0

コードの上に#include <sys/ioctl.h>を追加すると問題が解決します。

+0

私は、ファイルsockio.h識別子で ヘッダーの#includeが含まれていることを書くのを忘れて「SIOCGIFINDEX」あなたが持っている天気予報をチェックし、 – Anton

+0

あなたは 'sockio.h'を書いたと仮定すると、存在しません。申し訳ありません''、 ''、 ''、 ''、 ''、 ''のすべてのライブラリをインポートしました。私にとっては、 ''とコメントすればエラーが再現されます。また、私のコードを答えに入れることもできますが、実装と少し異なります。 の#include の#include の#includeはに の#include の#includeの#include する#include する#include <: – hmofrad

+0

私は次のヘッダーが含まれnetinetの/ in.h> する#include の#include の#include の#include の#include Anton

0

また、このコードを試してみることもできます。 これはという名前のインターフェイスをにして、何かをします。あなたが完了したら、ヘッダーを含め、メモリを解放することを忘れないでくださいifap

#include <ifaddrs.h> 
void do_smth_with_interface(const char *name) 
{ 
    if (!name) { 
     printf("Not a valid name, NULL ptr\n"); 
     return; 
    } 

    struct ifaddrs *ifap = NULL; 

    if(getifaddrs(&ifap) < 0) { 
     printf("Cannot not get a list of interfaces\n"); 
     return; 
    } 

    for(struct ifaddrs *p = ifap; p!=NULL; p=p->ifa_next) { 
     if (strcmp(p->ifa_name, name) == 0) 
       // do smth with the interface. 
    } 

    freeifaddrs(ifap); 
} 
関連する問題