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

cho dòng này:lỗi segmentation cho inet_ntoa

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

tôi nhận được

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

và cho

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

tôi nhận được lỗi phân khúc.

Điều gì là sai với điều này?

+2

trong linux, 'inet_ntoa' được định nghĩa trong tiêu đề '', có lẽ bạn cần phải '# include' cái đó? – Petesh

+1

Bạn cũng nhận được một khai báo _implicit function_? – hmjd

+0

bạn ngụ ý gì khi khai báo chức năng ngầm? – user138126

Trả lời

19

inet_ntoa được định nghĩa trong tiêu đề <arpa/inet.h>,
cần phải #include, nếu không, sẽ có lỗi

+4

Làm thế nào mà trình biên dịch đã không ném một cảnh báo nếu anh ta không bao gồm tiêu đề phải không ?? – Nikkolasg

1

inet_ntoa không đòi hỏi một con trỏ, nhưng giá trị

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

Nếu sin_addr là một con trỏ, bạn sẽ cần phải dereference nó.

inet_ntoa sẽ trở lại NULL nếu có một lỗi, vì vậy cố gắng để printf một NULL sẽ cuase một lỗi segmentation ...

Look here để biết thông tin và here cho người đàn ông trang.

+0

cách sửa đổi mã? – user138126

+0

Như tôi đã nêu trong câu trả lời của tôi và nếu bạn gặp lỗi, hãy đọc tài liệu, LUÔN LUÔN! –

+0

'sin_addr' không phải là một con trỏ, và tất cả mọi thứ có vẻ ok – user138126

1

Nếu bạn không muốn thấy cảnh báo, chỉ cần đúc giá trị trả về của inet_ntoa

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

Các lỗi phân khúc có lẽ là bởi vì một số các chức năng trước đó trả về một lỗi (giá trị null) và bạn trai tôi không 't kiểm tra xem nó

Mã tương tự đã hoạt động trong Hộp Linux của tôi.

+0

vẫn không thể tìm ra sự cố – user138126

+0

fd là một bộ mô tả tệp hợp lệ? ioctl trả về -1 hay sao? ifr chứa các giá trị hợp lệ? inet_ntoa trả lại một con trỏ null? trả lời các câu hỏi và sau đó bạn sẽ nhận được vấn đề là gì –

+0

fd là hợp lệ, trả về iotcl 0, inet_ntoa trả về giá trị hợp lệ, cách kiểm tra ifr? – user138126

Các vấn đề liên quan