使用inet_pton()获取IPv4地址的无符号int表示

时间:2015-04-05 01:11:36

标签: c++ windows

我正在尝试在C ++(Windows)中将IPv4地址从std::string转换为unsigned int表示(根据this

我设法使用以下代码执行此操作:

void strIPtoUnsignedIntIP(string ipStr){
    struct sockaddr_in ip4addr;

    ip4addr.sin_family = AF_INET;
    inet_pton(AF_INET, ipStr.c_str(), &ip4addr.sin_addr);

    unsigned int resIp = (ip4addr.sin_addr.S_un.S_un_b.s_b1 << 24) + 
                         (ip4addr.sin_addr.S_un.S_un_b.s_b2 << 16) + 
                          (ip4addr.sin_addr.S_un.S_un_b.s_b3 << 8) + 
                                  ip4addr.sin_addr.S_un.S_un_b.s_b4;
    cout << resIp << endl;

}

我得到了正确的价值观,但是,以下几行不是那么优雅:

unsigned int resIp = (ip4addr.sin_addr.S_un.S_un_b.s_b1 << 24) +
                     (ip4addr.sin_addr.S_un.S_un_b.s_b2 << 16) +
                      (ip4addr.sin_addr.S_un.S_un_b.s_b3 << 8) + 
                              ip4addr.sin_addr.S_un.S_un_b.s_b4;

我希望不是使用S_un_b的{​​{1}}字段然后执行计算,我可以简单地使用sin_addr字段。不幸的是,我得到了不同的价值观。

例如,对于字符串“192.168.1.1”:

  • 使用S_addr执行计算时,我得到了结果 3232235777(这是正确的值)
  • 当简单地取S_un_b中的值时,我得到了结果 16885952。

我的问题是:

  1. 为什么会有区别?

  2. 我可以利用S_addr获得所需的值吗?

1 个答案:

答案 0 :(得分:2)

根据MSDN doc for in_addr

struct in_addr {
  union {
    struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
    struct { u_short s_w1,s_w2; } S_un_w;
    u_long S_addr;
  } S_un;
};

所以你想要的只是u_long成员,按网络顺序(因为你希望s_b1成为最高位字节):

unsigned int resIp = htonl(ip4addr.sin_addr.S_un.S_addr);