gethostbyname在fedora 32位中工作正常但在64位上失败

时间:2012-07-19 13:01:29

标签: c linux sockets

gethostbyname在fedora 32位中工作正常,但在64位环境下失败会产生分段错误?在这种情况下,问题是什么,我们如何解决它?

#include <stdio.h>  
#include <string.h>  
#include <netdb.h>  
#include <netinet/in.h>  

struct hostent *he;  
struct in_addr a; 

int main (int argc, char **argv)  {  

    if (argc != 2)  {  
        fprintf(stderr, "usage: %s hostname\n", argv[0]);  
        return 1;  
    }  

    he = gethostbyname (argv[1]);  
    if (he)  {  
        printf("name :- %s\n", he->h_name);  
        while (*he->h_aliases)  
            printf("alias:- %s\n", *he->h_aliases++);  
        while (*he->h_addr_list)  {  
            bcopy(*he->h_addr_list++, (char *) &a, sizeof(a));  
            printf("address:- %s\n", inet_ntoa(a));  
        }  
    }  
    else  
        herror(argv[0]);  
    return 0;  
}

1 个答案:

答案 0 :(得分:2)

您缺少正确的包含:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

如果没有正确的包含,则假定inet_ntoa的返回类型为int。由于int与x86上的char*大小相同,因此没有问题。在x86_64上不是这样,因此printf读取该字符串会导致错误。