使用inet_pton()检查给定的IP是否属于IP范围

Checking if given IP is part of an IP range using inet_pton()

本文关键字:IP 是否 范围 属于 检查 inet pton 使用      更新时间:2023-10-16

inet_ptonAF_INET应该提供一个in_addr,其成员s_addr将具有与uint32_t类型等效的数字表示。我试图使用这个属性来检查给定的IP是否属于某个范围,如下所示:

#include <iostream>
#include <sstream>
#include <arpa/inet.h>
using namespace std;
template <class T> void convert_from_str (string s, T &r) {
    stringstream ss(s);
    ss >> r;
}
int main () {
    string cidr = "10.0.0.0/8", ip = "10.32.11.195", ci;
    in_addr in1, in2;
    uint32_t mask;
    size_t len;
    len = cidr.find_first_of('/');
    ci = cidr.substr(0, len);
    convert_from_str(cidr.substr(len + 1, cidr.length()), mask);
    mask = 32 - mask;
    inet_pton(AF_INET, ip.c_str(), &in1);
    inet_pton(AF_INET, ci.c_str(), &in2);
    if (in1.s_addr >> mask == in2.s_addr >> mask) {
        cout << "in range" << endl;
    }
    else {
        cout << "not in range" << endl;
    }
    return 0;
}

然而,这并没有像预期的那样奏效,每次都会产生"不在射程内"的结果。

问题出现在哪里?我该怎么做才能使它发挥作用?

s_addr按网络字节顺序排列;您需要将这些值传递给ntoh(),以便在移位之前将它们按主机字节顺序排列。