C Linux网络(gethostbyaddr)

C Linux网络(gethostbyaddr),c,linux,network-programming,C,Linux,Network Programming,我正在尝试获取IP地址为89.249.207.231的主机的主机信息。我知道它存在,因为当我在浏览器的url字段中键入IP地址时,它会找到页面。这是我的C代码 #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <stdio.h> #include <errno.h> int main() { struct in_addr add

我正在尝试获取IP地址为89.249.207.231的主机的主机信息。我知道它存在,因为当我在浏览器的url字段中键入IP地址时,它会找到页面。这是我的C代码

#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>

int main()
{
    struct in_addr addr;
    inet_aton("89.249.207.231", &addr);
    struct hostent* esu = gethostbyaddr((const char*)&addr),sizeof(addr), AF_INET);
    printf("%s\n", esu->h_name);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
地址中的结构;
内特阿顿(“89.249.207.231”和地址);
结构hostent*esu=gethostbyaddr((const char*)&addr),sizeof(addr),AF_INET);
printf(“%s\n”,esu->h_名称);
返回0;
}
当我编译并运行它时,它给出了“分段错误”。我无法理解代码的问题

如有任何提示和建议,将不胜感激


谢谢

即使主机存在,您也可能无法提取其主机名

例如,如果没有您使用的不推荐的函数,下面的代码给出的结果是
host=google-public-dns-a.google.com
,而使用您的主机地址给出的结果是
无法解析主机名

segfault的原因是
esu
NULL
,因为函数无法通过给定的IP解析主机名

代码如下:

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

int main()
{
    struct sockaddr_in sa;    /* input */
    socklen_t len;         /* input */
    char hbuf[NI_MAXHOST];
    
    memset(&sa, 0, sizeof(struct sockaddr_in));
    
    /* For IPv4*/
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = inet_addr("8.8.8.8");
    len = sizeof(struct sockaddr_in);
    
    if (getnameinfo((struct sockaddr *) &sa, len, hbuf, sizeof(hbuf), 
        NULL, 0, NI_NAMEREQD)) {
        printf("could not resolve hostname\n");
    }
    else {
        printf("host=%s\n", hbuf);
    }
    
    return 0;                                                  
}
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
sa中的结构sockaddr_;/*输入*/
socklen\u t len;/*输入*/
char hbuf[NI_MAXHOST];
memset(&sa,0,sizeof(struct sockaddr_in));
/*对于IPv4*/
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr(“8.8.8.8”);
len=sizeof(结构sockaddr_in);
if(getnameinfo((struct sockaddr*)&sa、len、hbuf、sizeof(hbuf),
空值,0,NI_NAMEREQD){
printf(“无法解析主机名\n”);
}
否则{
printf(“主机=%s\n”,hbuf);
}
返回0;
}

即使主机存在,您也可能无法提取其主机名

例如,如果没有您使用的不推荐的函数,下面的代码给出的结果是
host=google-public-dns-a.google.com
,而使用您的主机地址给出的结果是
无法解析主机名

segfault的原因是
esu
NULL
,因为函数无法通过给定的IP解析主机名

代码如下:

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

int main()
{
    struct sockaddr_in sa;    /* input */
    socklen_t len;         /* input */
    char hbuf[NI_MAXHOST];
    
    memset(&sa, 0, sizeof(struct sockaddr_in));
    
    /* For IPv4*/
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = inet_addr("8.8.8.8");
    len = sizeof(struct sockaddr_in);
    
    if (getnameinfo((struct sockaddr *) &sa, len, hbuf, sizeof(hbuf), 
        NULL, 0, NI_NAMEREQD)) {
        printf("could not resolve hostname\n");
    }
    else {
        printf("host=%s\n", hbuf);
    }
    
    return 0;                                                  
}
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
sa中的结构sockaddr_;/*输入*/
socklen\u t len;/*输入*/
char hbuf[NI_MAXHOST];
memset(&sa,0,sizeof(struct sockaddr_in));
/*对于IPv4*/
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr(“8.8.8.8”);
len=sizeof(结构sockaddr_in);
if(getnameinfo((struct sockaddr*)&sa、len、hbuf、sizeof(hbuf),
空值,0,NI_NAMEREQD){
printf(“无法解析主机名\n”);
}
否则{
printf(“主机=%s\n”,hbuf);
}
返回0;
}

即使主机存在,您也可能无法提取其主机名

例如,如果没有您使用的不推荐的函数,下面的代码给出的结果是
host=google-public-dns-a.google.com
,而使用您的主机地址给出的结果是
无法解析主机名

segfault的原因是
esu
NULL
,因为函数无法通过给定的IP解析主机名

代码如下:

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

int main()
{
    struct sockaddr_in sa;    /* input */
    socklen_t len;         /* input */
    char hbuf[NI_MAXHOST];
    
    memset(&sa, 0, sizeof(struct sockaddr_in));
    
    /* For IPv4*/
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = inet_addr("8.8.8.8");
    len = sizeof(struct sockaddr_in);
    
    if (getnameinfo((struct sockaddr *) &sa, len, hbuf, sizeof(hbuf), 
        NULL, 0, NI_NAMEREQD)) {
        printf("could not resolve hostname\n");
    }
    else {
        printf("host=%s\n", hbuf);
    }
    
    return 0;                                                  
}
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
sa中的结构sockaddr_;/*输入*/
socklen\u t len;/*输入*/
char hbuf[NI_MAXHOST];
memset(&sa,0,sizeof(struct sockaddr_in));
/*对于IPv4*/
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr(“8.8.8.8”);
len=sizeof(结构sockaddr_in);
if(getnameinfo((struct sockaddr*)&sa、len、hbuf、sizeof(hbuf),
空值,0,NI_NAMEREQD){
printf(“无法解析主机名\n”);
}
否则{
printf(“主机=%s\n”,hbuf);
}
返回0;
}

即使主机存在,您也可能无法提取其主机名

例如,如果没有您使用的不推荐的函数,下面的代码给出的结果是
host=google-public-dns-a.google.com
,而使用您的主机地址给出的结果是
无法解析主机名

segfault的原因是
esu
NULL
,因为函数无法通过给定的IP解析主机名

代码如下:

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

int main()
{
    struct sockaddr_in sa;    /* input */
    socklen_t len;         /* input */
    char hbuf[NI_MAXHOST];
    
    memset(&sa, 0, sizeof(struct sockaddr_in));
    
    /* For IPv4*/
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = inet_addr("8.8.8.8");
    len = sizeof(struct sockaddr_in);
    
    if (getnameinfo((struct sockaddr *) &sa, len, hbuf, sizeof(hbuf), 
        NULL, 0, NI_NAMEREQD)) {
        printf("could not resolve hostname\n");
    }
    else {
        printf("host=%s\n", hbuf);
    }
    
    return 0;                                                  
}
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
sa中的结构sockaddr_;/*输入*/
socklen\u t len;/*输入*/
char hbuf[NI_MAXHOST];
memset(&sa,0,sizeof(struct sockaddr_in));
/*对于IPv4*/
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr(“8.8.8.8”);
len=sizeof(结构sockaddr_in);
if(getnameinfo((struct sockaddr*)&sa、len、hbuf、sizeof(hbuf),
空值,0,NI_NAMEREQD){
printf(“无法解析主机名\n”);
}
否则{
printf(“主机=%s\n”,hbuf);
}
返回0;
}

首先检查
esu
。它可能是
NULL
。检查它,如果为空,请查看
h_errno
的值以了解确切的错误。h_errno的值为1。在哪里可以找到该错误的解释?使用perror();)此外,gethostbyaddr()已过时。请改用getnameinfo()。谢谢!我使用perror()并键入“Operation is not allowed”(操作不允许),但我不明白是什么导致了这样的错误。我不认为
perror
对这些错误有好处……请改用
herror
。首先检查
esu
。它可能是
NULL
。检查它,如果为空,请参阅
h_errno
的值以了解确切的错误。