比较ipv4地址 - sockaddr_in

时间:2017-11-09 20:24:58

标签: c++ range ipv4 sockaddr-in

我想知道某个地址是否在10.0.0.0 - 10.255.255.255范围内。

int localAddress = 0;
struct sockaddr_in localOneFirst;
struct sockaddr_in localOneLast;

inet_pton(AF_INET, "11.0.0.0", &(address.sin_addr));
inet_pton(AF_INET, "10.0.0.0", &(localOneFirst.sin_addr));
inet_pton(AF_INET, "10.255.255.255", &(localOneLast.sin_addr));

if((address.sin_addr.s_addr >= localOneFirst.sin_addr.s_addr) && (address.sin_addr.s_addr <= localOneLast.sin_addr.s_addr)) {
    localAddress = 1;
}

我的地址11.0.0.0大于10.255.255.255,但此程序显示不是。

因为“address.sin_addr.s_addr”的值为11且“localOneFirst.sin_addr.s_addr”的值更大。

那么我如何识别某个地址是否在此范围内?

1 个答案:

答案 0 :(得分:0)

sockaddr_in地址以网络字节顺序(大端)存储。如果您的代码在大端系统上运行,则值将无法正确比较。

比较值时使用ntohl()

bool localAddress = (
  (ntohl(address.sin_addr.s_addr) >= ntohl(localOneFirst.sin_addr.s_addr)) &&
  (ntohl(address.sin_addr.s_addr) <= ntohl(localOneLast.sin_addr.s_addr))
);