我正在尝试使用 gethostbyname_r() 获取我的机器 IP 地址。它应该以大端字节序的网络字节顺序给出 IP 地址。但我想我得到的是小端格式的地址。
例如,如果我的机器 IP 地址是 10.80.0.200,则 Big endian 整数应为 173015240 ((10 * 256 * 256 * 256) + (80 * 256 * 256) + 0 + 200),Little endian 整数应为 3355463690 ((200 * 256 * 256 * 256) + 0 + (80 * 256) + 10) 我总是得到的值为 3355463690 (小端)
下面是我的C++程序
rc = gethostbyname_r(hostname_.c_str(),
&h, buf, sizeof(buf),
&result, &local_errno);
if (rc) {
std::cout << "Failed to get the ip" << std::endl;
ipaddr_ = 0;
}
ipaddr_ = *reinterpret_cast<uint32_t *>(h.h_addr_list[0]);
有人可以告诉我为什么 gethostbyname_r() 以小端格式给出 IP 地址,而它应该是大端格式。或者执行reinterpret_cast正在改变字节序。但据我所知,reinterpret_cast 不会改变字节顺序。
注意: 我的机器格式是little endian。
import sys
sys.byteorder // 'little'
所有网络 API 均按大端顺序生成地址,这意味着它们存储在内存中,最高有效字节位于最低地址。
您正在获取地址并尝试将其解释为 uint32_t,它在您的平台上是小端字节序。
您的地址的字节为(十进制,从最低到最高内存地址):
10 80 0 200
解释为小尾数,这将是 200256^3 + 80256 + 10 = 3355463690。
如果您想要地址的字符串表示形式,请使用
inet_ntoa
- 它将使您不必自己解释字节。