使用inet_pton()检查给定的IP是否属于IP范围
Checking if given IP is part of an IP range using inet_pton()
inet_pton
和AF_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()
,以便在移位之前将它们按主机字节顺序排列。
相关文章:
- 是否有一种标准化的方法通过TCP/IP网络发送JPG图像
- 检查IP是否在其他IP网络范围内,并查找下一个可用IP
- 检查 IP 第一个八位字节是否不以 127 / 224 或 255 开头
- 使用全局 IP 地址时,C++ winsock 2 应用程序中的代码是否必须更改?
- TCP/IP 客户端是否可以连接到无法访问的 IP
- Boost asio ip tcp iostream 是否支持异步?
- boost::asio::ip::tcp::resolver::iterator 检查值是否为空
- 如果我们只知道IP,如何知道服务器是否在线
- Boost检查是否通过UDP收到的IP地址是本地的
- 是否可以根据C/C 代码上的Linux上的(动态更改的IP地址集)丢弃传入数据包
- 如何使用Qt确定我的互联网IP是否属于给定的IP列表
- 一般来说,如何找出客户端是否分配了静态Ip或是dhcp客户端
- 如何知道 IP 地址是否在 Linux 服务器上是本地的
- 通过其 IP 地址检测服务器是否在本地运行
- 是否可以以编程方式检测 Windows XP 上特定以太网接口上的 IP 地址更改?
- 如何查找 IP 地址是否为链路本地地址
- 验证 IP 地址是否已颁发的简单方法
- 如何确定 URL 是否为 C/C++ 中的 IP 地址
- 使用inet_pton()检查给定的IP是否属于IP范围
- 是否有可能绑定和监听一个IP地址与TCP/IP套接字?(Linux / C)