2013-03-26 4 views
6
#include <stdio.h> 
    #include <string.h> /* for strncpy */ 
    #include <sys/types.h> 
    #include <sys/socket.h> 
    #include <sys/ioctl.h> 
    #include <netinet/in.h> 
    #include <net/if.h> 

    int 
    main() 
    { 
    int fd; 
    struct ifreq ifr; 

    fd = socket(AF_INET, SOCK_DGRAM, 0); 

    /* I want to get an IPv4 IP address */ 
    ifr.ifr_addr.sa_family = AF_INET; 

    /* I want IP address attached to "eth0" */ 
    strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1); 

    ioctl(fd, SIOCGIFADDR, &ifr); 

    close(fd); 

    /* display result */ 
    char* ipaddr; 
    ipaddr = inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr); 
    printf("%s\n", ipaddr); 

    return 0; 
    } 

セグメンテーションフォールトこのライン用

 ipaddr = inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr);   

私は

iptry.c: In function ‘main’: 
iptry.c:31:9: warning: assignment makes pointer from integer without a cast [enabled by default] 

 printf("%s\n", ipaddr); 

のために、私はセグメンテーションフォールトを取得を取得します。

この問題は何ですか?

+2

があるだろう、#includeに必要それ? – Petesh

+1

_implicit関数宣言_警告も受け取っていますか? – hmjd

+0

暗黙の関数宣言はどういう意味ですか? – user138126

答えて

19

inet_ntoaはヘッダ<arpa/inet.h>で定義されている、
そうでない場合は、 `inet_ntoa`は、おそらくあなたは、`#のinclude`する必要があり、ヘッダ ` `で定義されている、Linuxではエラー

+4

コンパイラは、正しいヘッダーを含めなかった場合、どのように警告をスローしませんでしたか? – Nikkolasg

1

inet_ntoaはポインタを要求しませんが、sin_addrがポインタである場合、値

char* ipaddr; 
ipaddr = inet_ntoa(((struct sockaddr_in)(ifr.ifr_addr))->sin_addr); 

は、あなたはそれを間接参照する必要があります。そうNULLがセグメンテーションフォールトをcuaseますprintfにしようと、エラーが発生した場合

inet_ntoa

は...マン・ページのための情報や hereため

ルックhereNULLを返します。

+0

コードを変更するには? – user138126

+0

私が私の答えで述べたように、エラーが発生した場合は、ドキュメントを読んでください! –

+0

'sin_addr'はポインタではありません。すべてがOKです。 – user138126

1

警告を表示したくない場合は、単に以前の機能の一部がエラー(NULL値)を返し、あなたはdidnのため、セグメンテーションフォールトがおそらくあるINET_NTOA

ipaddr = (char *) inet_ntoa(((struct sockaddr_in *)&(ifr.ifr_addr))->sin_addr); 

の戻り値をキャストそれをチェックしないでください

私のLinuxボックスでも同じコードが働いていました。

+0

はまだ問題を把握できません – user138126

+0

fdは有効なファイル記述子ですか? ioctlは-1を返しましたか? ifrに有効な値が含まれていますか? inet_ntoaがヌルポインタを返しましたか?質問に答えると何が問題になるのですか –

+0

fdは有効です、iotclは0を返します、inet_ntoaは有効な値を返します、ifrをチェックする方法は? – user138126

関連する問題