c++ - getbyhostname() 是如何工作的?

标签 c++ c sockets ip

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

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

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

最佳答案

首先,您不应该使用gethostbyname 接口(interface)。它已被弃用,无法处理 IPv6,IPv6 是 2012 年现实世界中一个实用的展示停止器。要使用的正确接口(interface)是 getaddrinfo。使用 getaddrinfo 查找主机名并将其以套接字地址形式显示后,您可以使用带有 NI_NUMERICHOST 标志的 getnameinfo 来转换将其转换为可打印的 IP 地址表格。这适用于 IPv4 或 IPv6,或任何 future 的协议(protocol)。

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

关于c++ - getbyhostname() 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9138383/

相关文章:

c - 如何用 C 语言从网站或文件上传球队名单?

c# - NetworkStream 正在读取不应该存在的数据

c# - 创建新的空白应用程序时,Xamarin Android Visual Studio布局未呈现

c++ - 如何使 QtLinguist 随 Qt 5.9.1 一起工作?

c - 如何查找数组中其中一个元素为零的元素数量

c - 了解 C 中函数指针的类型定义

Linux 中 C/Socket 编程中的聊天室

c++ - 将 char* 分成几个变量

c++ - 如何分析 Linux 可执行文件的静态内存使用情况?

c++ - 循环之间的 pthread_create 中重复的线程 ID?