我正在尝试解决一个错误,其中我尝试打印我的机器的 IP 地址。该机器使用 RedHat 操作系统。目标是使用
gethostid()
获取主机 id,然后使用函数 inet_ntoa
将其值转换为字符串。
问题是结果显示地址的顺序错误。 IP 地址的顺序为 a.b.c.d,但
inet_ntoa
的结果显示为 b.a.d.c。我知道使用这些函数时存在字节顺序问题,但我认为不尊重字节顺序会导致 IP 地址反转
我认为问题可能出在
gethostid()
返回的值上。但如果是这样的话,我不知道为什么它给了我一个错误的 id。
我的IP地址是172.30.223.27
gethostid()
返回514595807,十六进制为1EAC1BDF,然后转换为字节30.172.27.223
#include <arpa/inet.h>
#include <iostream>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
int main() {
long hostId = gethostid();
std::cout << "Host ID: " << hostId << std::endl;
struct in_addr addr = inet_makeaddr(hostId,0 );
::std::string ipv4_addr_str = inet_ntoa(addr);
std::cout << "IP using inet_ntoa: " << ipv4_addr_str << std::endl;
char ipString[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &addr, ipString, INET_ADDRSTRLEN);
std::cout << "IP using using inet_ntop: " << ipString << std::endl;
return 0;
}
输出为:
Host ID: 514595807
IP using inet_ntoa: 30.172.27.223
IP using using inet_ntop: 30.172.27.223
我尝试使用
inet_ntoa
和inet_ntop
看看问题是否出在打印IP的那一刻,但问题似乎出在gethostid()
获取的值上
为什么会出现这种情况?
不要尝试使用
gethostid
作为 IP 地址;事实并非如此。
查看手册页:
This normally resembles the Internet address for the local
machine, as returned by gethostbyname(3), and thus usually never
needs to be set.
...
In the glibc implementation, the hostid is stored in the file
/etc/hostid. (Before glibc 2.2, the file /var/adm/hostid was
used.)
In the glibc implementation, if gethostid() cannot open the file
containing the host ID, then it obtains the hostname using
gethostname(2), passes that hostname to gethostbyname_r(3) in
order to obtain the host's IPv4 address, and returns a value
obtained by bit-twiddling the IPv4 address. (This value may not
be unique.)
注意第一段中的“正常”,它是可以设置的,并且 最后一段中的“有点扭捏”)。