inet_netof()并返回主机字节顺序

时间:2014-11-06 13:29:51

标签: c sockets endianness

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

int main(int argc, char **argv) {
  unsigned long addr;
  unsigned long net_id;
  struct sockaddr_in address;

  addr = inet_addr("192.168.50.25");
  // prints 1932A8C0 in host byte-order which in this case is little-endian
  printf("IP-Address in Host-Byte Order: %08X\n", (unsigned int) addr);


  // zero the struct out
  memset(&address, 0, sizeof address);

  // copy address into the struct   
  memcpy(&address.sin_addr.s_addr, &addr, sizeof addr); 

  // inet_netof returns the network ID in host byte order
  net_id = inet_netof(address.sin_addr);

  // prints 00C0A832 Why not 0032A8C0?
  printf("Network ID in Host-Byte-Order: %08X\n", (unsigned int) net_id);
  return 0;
}

我有一个小端机器,所以主机字节顺序是小端。 IP地址192.168.50.25以主机字节顺序为0x1932A8C0。这对我来说很明显。

现在,inet_netof函数以host-byte-order的形式返回地址192.168.50.25的networkID。输出为0x00C0A832。这让我很困惑。对我来说,这看起来并不像是小端。如果我将其转换为点分十进制,则为:0.192.168.50。

我原本假设网络ID在little-endian中看起来像这样:0.50.168.192或0x0032A8C0十六进制而不是inet_netof()返回0x00C0A832。

为什么inet_netof()返回0x00C0A832而不是0x0032A8C0?

2 个答案:

答案 0 :(得分:1)

  1. inet_addr()返回网络字节顺序。
  2. 您收到的网络号是三个字节。
  3. inet_netof()返回主机字节顺序,即Little-endian。由于您的计算机是Little-endian,inet_netof()返回的字节与inet_addr()返回的输出相比,顺序相反。
  4. 供参考,请参阅man 3 inet

答案 1 :(得分:1)

正如你所说,

0x00C0A8320.192.168.50

它是以主机字节顺序和正确的值。

文档中的措辞有点模糊(“返回网络地址的网络号码部分”),但是如果我检查implementation,那就是右移,所以一切似乎都没问题。