2013-03-26 42 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; 
    } 

这条线分段错误:为INET_NTOA

 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

,'inet_ntoa'在头''定义,也许你需要'#include'那? – Petesh 2013-03-26 11:26:32

+1

你还得到一个_implicit函数declaration_ warning吗? – hmjd 2013-03-26 11:26:44

+0

隐式函数声明是什么意思? – user138126 2013-03-26 12:04:43

回答

19

inet_ntoa在头<arpa/inet.h>
需要#include定义,否则,就会出现错误

在linux
+4

如果编译器没有包含正确的头文件,它不会发出警告? – Nikkolasg 2014-12-27 21:35:53

1

inet_ntoa不要求一个指针,但价值

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

如果sin_addr是一个指针,你需要取消对它的引用。

inet_ntoa将返回NULL,如果有错误,因此试图printf一个NULL将cuase分段错误...为人为的页面信息和here

here

+0

如何修改代码? – user138126 2013-03-26 11:35:26

+0

就像我在我的回答中所述,如果您遇到错误,请阅读文档,始终! – 2013-03-26 11:36:27

+0

'sin_addr'不是一个指针,并且一切似乎都没有问题 – user138126 2013-03-26 12:00:48

1

如果你不希望看到的警告,只投INET_NTOA的返回值

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

段故障可能是因为以前的一些函数返回一个错误(空值),你没't检查它

相同的代码在我的Linux Box中工作。

+0

仍然无法弄清楚问题 – user138126 2013-03-26 11:50:44

+0

fd是一个有效的文件描述符? ioctl返回-1或其他什么? ifr包含有效的值? inet_ntoa返回一个空指针?回答这些问题,然后你会得到什么问题 – 2013-03-26 11:53:57

+0

fd是有效的,iotcl返回0,inet_ntoa返回有效值,如何检查ifr? – user138126 2013-03-26 12:04:22