getbyhostname()是如何工作的

How does getbyhostname() work?

本文关键字:工作 getbyhostname 何工作      更新时间:2023-10-16

我正在编写一个基本的UDP客户端服务器程序,但没有从getbyhostname()中获得预期的结果。以下是我的代码片段:

char *clientHostName = malloc(HOST_NAME_MAX);
gethostname(clientHostName, HOST_NAME_MAX);
printf("%sn",clientHostName);
struct hostent thehost = gethostbyname(clientHostName);
printf("%ldn",(*((unsigned long *) thehost->h_addr_list[0])));

所以,第一个print语句输出了我所期望的,我的计算机的名称。但是,我希望第二个打印声明打印出我的IP地址。但不,它打印出这样的东西:4398250634。它打印出来的是什么?如何获取我的IP地址?

首先,您不应该使用gethostbyname接口。它已被弃用,无法处理IPv6,而IPv6在2012年是一个现实世界中的实际障碍。要使用的正确接口是getaddrinfo。一旦使用getaddrinfo查找主机名并将其保存在套接字地址形式中,就可以使用带有NI_NUMERICHOST标志的getnameinfo将其转换为可打印的IP地址形式。这适用于IPv4或IPv6,也适用于任何未来的协议。

至于您的特定打印问题,您希望%ld如何打印IP地址?它打印一个十进制数字(以10为基数)(long)。相反,您可以将指针强制转换为unsigned char *并读取4个元素,每个元素都用%d打印,但这也是一种糟糕的方法。

您正在调用的函数和正在检查的字段会为您提供一个32位变量,每个8位八位字节都包含您的IP地址段。以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#define HOST_NAME_MAX 1024
int main (void) {
    char *clientHostName = malloc(HOST_NAME_MAX);
    gethostname(clientHostName, HOST_NAME_MAX);
    printf("%sn",clientHostName);
    struct hostent *thehost = gethostbyname(clientHostName);
    printf("%ldn",(*((unsigned long *) thehost->h_addr_list[0])));
    printf("%08lxn",(*((unsigned long *) thehost->h_addr_list[0])));
    return 0;
}

在我的Xubuntu盒子上给出:

formaldehyde
16842879
0101007f

如果你把末尾的十六进制数分解成0101007f,那就是(由于我的CPU,按相反的顺序)127.0.1.1,一个环回地址。