IP地址匹配功能

2024-01-01

我需要找出ip是否属于ip mask。 例如:

ip = 192.168.0.1 掩码=192.168.0.1/24。

我找到了将 ip 转换为掩码的函数:

inet_cidrtoaddr(int cidr, struct in_addr *addr)
{
        int ocets;

        if (cidr < 0 || cidr > 32) {
                errno = EINVAL;
                return -1;
        }
        ocets = (cidr + 7) / 8;

        addr->s_addr = 0;
        if (ocets > 0) {
                memset(&addr->s_addr, 255, (size_t)ocets - 1);
                memset((unsigned char *)&addr->s_addr + (ocets - 1),
                       (256 - (1 << (32 - cidr) % 8)), 1);
        }

        return 0;
}

如何比较 ip 和 cidr 范围?


因此,将奥利斯的答案放入代码中:

// Check if 192.168.0.1 is inside 192.168.0.0/24
in_addr ip, net, netmask;
inet_aton("192.168.0.1", &ip);
inet_aton("192.168.0.0", &net);

He said:

inet_cidrtoaddr(24, &netmask);
bool is_inside = ((ip.s_addr & netmask.s_addr) == (net.s_addr & netmask.s_addr));

我更喜欢方法虽然:

bool cidr_match(const in_addr &addr, const in_addr &net, uint8_t bits) {
  if (bits == 0) {
    // C99 6.5.7 (3): u32 << 32 is undefined behaviour
    return true;
  }
  return !((addr.s_addr ^ net.s_addr) & htonl(0xFFFFFFFFu << (32 - bits)));
}
bool is_inside = cidr_match(ip, net, 24);

我尝试了一堆不同的输入:https://gist.github.com/duedal/b83303b4988a4afb2a75 https://gist.github.com/duedal/b83303b4988a4afb2a75

如果发现此问题的人也想要 IPv6 解决方案:

bool cidr6_match(const in6_addr &address, const in6_addr &network, uint8_t bits) {
#ifdef LINUX
  const uint32_t *a = address.s6_addr32;
  const uint32_t *n = network.s6_addr32;
#else
  const uint32_t *a = address.__u6_addr.__u6_addr32;
  const uint32_t *n = network.__u6_addr.__u6_addr32;
#endif
  int bits_whole, bits_incomplete;
  bits_whole = bits >> 5;         // number of whole u32
  bits_incomplete = bits & 0x1F;  // number of bits in incomplete u32
  if (bits_whole) {
    if (memcmp(a, n, bits_whole << 2)) {
      return false;
    }
  }
  if (bits_incomplete) {
    uint32_t mask = htonl((0xFFFFFFFFu) << (32 - bits_incomplete));
    if ((a[bits_whole] ^ n[bits_whole]) & mask) {
      return false;
    }
  }
  return true;
}

检查 2001:db8::ff00:42:8329 是否存在于 2001:db8/32 中。请注意 inet_net_pton 非常挑剔,它是 2001:db8/32 而不是 2001:db8::/32。然而 2001:db8::/48 是完全有效的(也称为 2001:db8:0/48)。

in6_addr ip6, net6, net6_48;
memset(&net6, 0, sizeof(net6));
memset(&net6_48, 0, sizeof(net6_48)); 
assert(inet_pton(AF_INET6, "2001:db8::ff00:42:8329", &ip6));

int bits = inet_net_pton(AF_INET6, "2001:db8/32", &net6, sizeof(net6));
assert((bits != -1));  // assert that inet_net_pton understood us
bool is_inside6 = cidr6_match(ip6, net6, bits);

int bits_48 = inet_net_pton(AF_INET6, "2001:db8::/48", &net6_48, sizeof(net6_48));
assert((bits_48 == 48));
bool is_inside6_48 = cidr6_match(ip6, net6_48, bits_48);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IP地址匹配功能 的相关文章

  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 获取有关 YouTube 视频的信息

    我希望获取 YouTube 视频的标题和持续时间并将其显示在我的应用程序中 我想动态地执行此操作 因为会有多个视频并且它们会发生变化 我寻找过提供此信息的 URL 但没有找到 有谁知道如何做到这一点 您需要使用 Youtube API 有关
  • QtCreator:如何设置调试参数? [复制]

    这个问题在这里已经有答案了 在 QtCreator 中 我无法找到如何设置在调试模式下运行时传递给可执行文件的参数 在 QtCreator 2 6 2 中应该是 转到 调试 下名为 项目 的选项卡 现在你必须选择适合你的 Qt 版本的工具包
  • 为什么 joblib.Parallel() 比非并行计算花费更多时间? Parallel() 不应该比非并行计算运行得更快吗?

    A joblib https joblib readthedocs io en latest parallel html模块提供了一个简单的帮助程序类来使用多处理编写并行 for 循环 此代码使用列表理解来完成这项工作 import tim
  • 涉及多个表的一对一关系

    Say 我有3张桌子 User其中包含有关用户的基本信息 SectionA其中包含有关用户的更多信息 SectionB其中还包含有关用户的更多信息 只能有一个SectionA and SectionB每个用户的数据 我的想法是创建一个像这样
  • 如何使 Volley NetworkImageView 离线工作

    I use Volley NetworkImageView从互联网下载图像并显示在我的listview 现在我想做Volley NetworkImageView当没有可用网络时显示保存的图像 Volley已经缓存了图像URL作为关键 因为当
  • 在 R 中使用 sapply 绘制并排图

    我有以下代码 dat lt read table text Topic Project C10 C14 C03 C11 C16 C08 T1 P1 0 24 0 00 0 00 0 04 0 04 0 00 T2 P1 0 00 0 30
  • 基于逻辑快速 Segue

    我想在应用程序首次启动时根据 if 语句快速显示两个视图之一 我该怎么做 这就是逻辑 if signupconfirmed true have to show one view else have to show another view
  • 礼项分两行。第二行没有边距

    我目前正在处理一个无序列表 其中包含带有标语的列表项 我遇到了有关一个列表项的问题 该列表项足够长 可以占用两行 参见图片 我希望第二行与第一行对齐 这是我正在使用的 HTML 代码 我使用 fontAwesome 作为检查图像 ul wi
  • 如何使用Java代码检查客户端浏览器中是否启用了JavaScript

    任何人都可以帮助我尝试使用 Java 代码检查客户端浏览器中是否启用了 JavaScript 假设您正在编写一个 Java Web 应用程序 我成功使用的一项技术是让访问的第一个页面 通常是登录表单 在页面加载时写入会话 cookie 然后
  • Pinterest 关注者显示

    我该如何在 Wordpress 中显示我的 Pinterest 关注者 我试过this http business pinterest com widget builder do follow me button但它只显示让用户关注我的帐户
  • Node Webkit 应用程序:隐藏光标

    我正在全屏模式下使用 nodewebkit 开发我的网络应用程序 它必须与触摸屏显示器一起使用 我使用过 CSS 属性 html cursor none In NodeWebKit 的清单 https github com rogerwan
  • web.xml 中针对没有角色成员身份的经过身份验证的用户的安全约束

    我非常绝望 因为我认为一定有一个简单的解决方案来解决我的问题 但我正在寻找 无济于事 我在 Glassfish 3 1 1 中使用自定义领域 此自定义领域 实现 AppservPasswordLoginModuleInterface 从 H
  • 在 Windows 7 上使用 .NET 以编程方式创建/销毁网桥

    我正在尝试以编程方式在 Windows 7 上创建和销毁网桥 从技术上讲 我希望留在 Net 4 领域 PInvokes 很好 ofc 但使用 C 是一种选择 到目前为止我的研究表明 对于配置 netsh 命令是要去的路线 https st
  • Dojo 自定义构建由于缺少资源而出现浏览器错误

    我一直在努力学习基于 AMD 的 Dojo 构建系统 到目前为止 我还无法获得一个在浏览器 FF 中不会出现加载错误的情况下可用的构建 我对如何管理构建有疑问 我的构建配置文件有一个包部分 我在那里指定的内容似乎与写入目标目录的相同包目录直
  • 如何在没有 web.xml 的情况下实现 jaxrs 应用程序 [重复]

    这个问题在这里已经有答案了 我正在尝试部署一个非常简单的 jaxrs 应用程序 但没有 web xml 配置 但无法使其工作 我希望访问的 URL 是 serverandport appname rest welcomes hello 我想
  • 按文件中的列批量排序

    我想知道是否有可能按列对文本文件进行排序 例如 I have aux1 txt像这样的行 Name SecondName Grade 在外壳中我可以做到这一点 sort r k 3 aux1 它按第三列 等级 对文件进行排序 批量中 sor
  • 对列表中相同元素的索引进行分组的有效方法

    假设我有一个如下所示的列表 1 2 2 5 8 3 3 9 0 1 现在我想对相同元素的索引进行分组 因此结果应如下所示 0 9 1 2 3 4 5 6 7 8 我如何以有效的方式做到这一点 我尽量避免使用循环 因此任何使用 numpy p
  • 我想将 Angular 4 的数据发送到 javaservlet (跨域)[重复]

    这个问题在这里已经有答案了 我想将数据从 Angular 4 发送到 java servlet 但无法发送 因为没有通过访问控制 我想用java servlet将数据插入数据库 这是我的代码 前端 data service ts impor
  • 我可以匹配具有相同值形状的所有枚举变体吗?

    我有一个枚举 enum MyEnum A i32 B i32 C D 我可以匹配吗A and B同时与这样的事情 let a MyEnum A 1 match a n gt do something for all variants whi
  • IP地址匹配功能

    我需要找出ip是否属于ip mask 例如 ip 192 168 0 1 掩码 192 168 0 1 24 我找到了将 ip 转换为掩码的函数 inet cidrtoaddr int cidr struct in addr addr in