gethostbyname_r 以小端格式给出 IP 地址

问题描述 投票:0回答:1

我正在尝试使用 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'
c++ endianness
1个回答
0
投票

所有网络 API 均按大端顺序生成地址,这意味着它们存储在内存中,最高有效字节位于最低地址。

您正在获取地址并尝试将其解释为 uint32_t,它在您的平台上是小端字节序。

您的地址的字节为(十进制,从最低到最高内存地址):

10 80 0 200

解释为小尾数,这将是 200256^3 + 80256 + 10 = 3355463690。

如果您想要地址的字符串表示形式,请使用

inet_ntoa
- 它将使您不必自己解释字节。

© www.soinside.com 2019 - 2024. All rights reserved.