【Linux】Linux C比较两个 IPv6 网关地址是否相等,包括前缀

功能说明

          在 Linux 环境下使用 C 语言比较两个 IPv6 网关地址是否相等,包括前缀

实现步骤

  1. 解析 IPv6 地址:使用 inet_pton 将字符串形式的 IPv6 地址转换为二进制形式。
  2. 解析前缀长度:从地址字符串中提取前缀长度(如 /64)。
  3. 比较前缀:根据前缀长度,逐位比较两个地址的前缀部分。

示例代码

以下是一个完整的 C 程序示例:

#include <stdio.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdint.h>
#include <stdlib.h>// 从 IPv6 地址字符串中提取前缀长度
int extract_prefix_length(const char *addr, char *ip, int *prefix_length)
{char *slash = strchr(addr, '/');if (slash){// 提取前缀长度*prefix_length = atoi(slash + 1);if (*prefix_length < 0 || *prefix_length > 128){fprintf(stderr, "Invalid prefix length: %d\n", *prefix_length);return -1;}// 提取 IPv6 地址部分strncpy(ip, addr, slash - addr);ip[slash - addr] = '\0';} else{// 如果没有前缀长度,默认使用 128strcpy(ip, addr);*prefix_length = 128;}return 0;
}// 比较两个 IPv6 地址的前缀是否相等
int compare_ipv6_with_prefix(const char *addr1, const char *addr2)
{struct in6_addr ipv6_1, ipv6_2;char ip1[INET6_ADDRSTRLEN], ip2[INET6_ADDRSTRLEN];int prefix_length1, prefix_length2;// 提取 IPv6 地址和前缀长度if (extract_prefix_length(addr1, ip1, &prefix_length1) != 0 ||extract_prefix_length(addr2, ip2, &prefix_length2) != 0){return 0;}// 如果前缀长度不同,则直接返回不相等if (prefix_length1 != prefix_length2){return 0;}// 将 IPv6 地址从字符串转换为二进制形式if (inet_pton(AF_INET6, ip1, &ipv6_1) != 1){fprintf(stderr, "Invalid IPv6 address: %s\n", ip1);return 0;}if (inet_pton(AF_INET6, ip2, &ipv6_2) != 1) {fprintf(stderr, "Invalid IPv6 address: %s\n", ip2);return 0;}// 计算需要比较的字节数和剩余的位数int full_bytes = prefix_length1 / 8; // 完整字节数int remaining_bits = prefix_length1 % 8; // 剩余的位数// 比较完整字节if (memcmp(&ipv6_1, &ipv6_2, full_bytes) != 0){return 0; // 前缀不相等}// 比较剩余的位if (remaining_bits > 0) {uint8_t mask = (0xFF << (8 - remaining_bits)) & 0xFF; // 生成掩码if ((ipv6_1.s6_addr[full_bytes] & mask) != (ipv6_2.s6_addr[full_bytes] & mask)){return 0; // 前缀不相等}}return 1; // 前缀相等
}int main() 
{const char *addr1 = "2001:db8:85a3::8a2e:370:7334/64";const char *addr2 = "2001:db8:85a3::1/64";if (compare_ipv6_with_prefix(addr1, addr2)){printf("The IPv6 addresses are equal within the prefix length.\n");} else{printf("The IPv6 addresses are NOT equal within the prefix length.\n");}return 0;
}

代码说明

  1. extract_prefix_length
    • 从 IPv6 地址字符串中提取前缀长度(如 /64)。
    • 如果没有指定前缀长度,默认使用 128
  2. inet_pton
    • 将 IPv6 地址从字符串形式转换为 struct in6_addr 的二进制形式。
  3. 前缀比较
    • 使用 memcmp 比较完整字节。
    • 对于剩余的位,使用掩码逐位比较。
  4. 输入参数
    • addr1 和 addr2 是两个 IPv6 地址(包括前缀)的字符串形式。

测试示例

  • 输入地址:

    • addr1 = "2001:db8:85a3::8a2e:370:7334/64"
    • addr2 = "2001:db8:85a3::1/64"
  • 输出结果:

    The IPv6 addresses are equal within the prefix length.
  • 输入地址:

    • addr1 = "2001:db8:85a3::8a2e:370:7334/64"
    • addr2 = "2001:db8:85a3::1/128"
  • 输出结果:

    The IPv6 addresses are NOT equal within the prefix length.

注意事项

  1. 地址格式:IPv6 地址可能有多种表示形式(如压缩形式),但 inet_pton 会将其标准化为二进制形式。
  2. 前缀长度范围:前缀长度必须在 0-128 之间。
  3. 无效地址处理:如果输入的 IPv6 地址无效,程序会提示错误。
  4. 默认前缀长度:如果未指定前缀长度,程序默认使用 128

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9061.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外问卷调查渠道查如何设置:最佳实践+示例

随着经济全球化和一体化进程的加速&#xff0c;企业间的竞争日益加剧&#xff0c;为了获得更大的市场份额&#xff0c;对企业和品牌而言&#xff0c;了解受众群体的的需求、偏好和痛点才是走向成功的关键。而海外问卷调查才是获得受众群体痛点的关键&#xff0c;制作海外问卷调…

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器&#xff0c;算是比较的基础容器&#xff0c;也是大家在日常开发中常用到的容器&#xff0c;因为底层用到的数据结构比较简单&#xff0c;笔者就将他们三者放到一起做下对比分析&#xff0c;介绍下基本用法&a…

一组开源、免费、Metro风格的 WPF UI 控件库

前言 今天大姚给大家分享一个开源、免费、Metro风格的 WPF UI 控件库&#xff1a;MahApps.Metro。 项目介绍 MahApps.Metro 是一个开源、免费、Metro风格的 WPF UI 控件库&#xff0c;提供了现代化、平滑和美观的控件和样式&#xff0c;帮助开发人员轻松创建具有现代感的 Win…

网易云音乐歌名可视化:词云生成与GitHub-Pages部署实践

引言 本文将基于前一篇爬取的网易云音乐数据, 利用Python的wordcloud、matplotlib等库, 对歌名数据进行深入的词云可视化分析. 我们将探索不同random_state对词云布局的影响, 并详细介绍如何将生成的词云图部署到GitHub Pages, 实现数据可视化的在线展示. 介绍了如何从原始数据…

通义灵码插件保姆级教学-IDEA(安装及使用)

一、JetBrains IDEA 中安装指南 官方下载指南&#xff1a;通义灵码安装教程-阿里云 步骤 1&#xff1a;准备工作 操作系统&#xff1a;Windows 7 及以上、macOS、Linux&#xff1b; 下载并安装兼容的 JetBrains IDEs 2020.3 及以上版本&#xff0c;通义灵码与以下 IDE 兼容&…

工业级 RAG 实现 - QAnything

文章目录 1. QAnything简介2. QAnything 安装教程2. 1 安装软件包2.2 运行QAnything框架2.3 访问前端页面 3. QAnything 简单使用3.1 创建知识库3.2 创建聊天机器人3.3 关联知识库3.4 测试 4. QAnything 的分析&#xff1a;4. 1 QAnything 架构4. 2 两阶段检索4. 2.1 一阶段检索…

Cross-Resolution知识蒸馏论文学习

TPAMI 2024&#xff1a;Pixel Distillation: Cost-Flexible Distillation Across Image Sizes and Heterogeneous Networks 教师模型使用高分辨率输入进行学习&#xff0c;学生模型使用低分辨率输入进行学习 学生蒸馏损失&#xff1a;Lpkd和Lisrd Lpkd&#xff1a;任务损失lo…

Versal - 基础3(AXI NoC 专题+仿真+QoS)

目录 1. 简介 2. 示例 2.1 示例说明 2.2 创建项目 2.2.1 平台信息 2.2.2 AXI NoC Automation 2.2.3 创建时钟和复位 2.3 配置 NoC 2.4 配置 AXI Traffic 2.5 配置 Memory Size 2.6 Validate BD 2.7 添加观察信号 2.8 运行仿真 2.9 查看结果 2.9.1 整体波形 2.9…

【PostgreSQL内核学习 —— (WindowAgg(一))】

WindowAgg 窗口函数介绍WindowAgg理论层面源码层面WindowObjectData 结构体WindowStatePerFuncData 结构体WindowStatePerAggData 结构体eval_windowaggregates 函数update_frameheadpos 函数 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&#xff0c;我们尊…

RubyFPV开源代码之系统简介

RubyFPV开源代码之系统简介 1. 源由2. 工程架构3. 特性介绍&#xff08;软件&#xff09;3.1 特性亮点3.2 数字优势3.3 使用功能 4. DEMO推荐&#xff08;硬件&#xff09;4.1 天空端4.2 地面端4.3 按键硬件Raspberry PiRadxa 3W/E/C 5. 软件设计6. 参考资料 1. 源由 RubyFPV以…

MySQL(单表访问)

今天是新年&#xff0c;祝大家新年快乐&#xff0c;但是生活还是得继续。 后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 大部分截图和文章采…

汇编的使用总结

一、汇编的组成 1、汇编指令&#xff08;指令集&#xff09; 数据处理指令: 数据搬移指令 数据移位指令 位运算指令 算术运算指令 比较指令 跳转指令 内存读写指令 状态寄存器传送指令 异常产生指令等 2、伪指令 不是汇编指令&#xff0c;但是可以起到指令的作用&#xff0c;伪…

汇编基础语法及其示例

1.汇编指令 1.1汇编指令的基本格式 <opcode>{<cond>}{s} <Rd> , <Rn> , <shifter_operand> <功能码>{<条件码>}{cpsr影响位} <目标寄存器> , <第一操作寄存器> , <第二操作数> 注&#xff1a;第一操作寄存器…

FLTK - FLTK1.4.1 - 搭建模板,将FLTK自带的实现搬过来做实验

文章目录 FLTK - FLTK1.4.1 - 搭建模板&#xff0c;将FLTK自带的实现搬过来做实验概述笔记my_fltk_test.cppfltk_test.hfltk_test.cxx用adjuster工程试了一下&#xff0c;好使。END FLTK - FLTK1.4.1 - 搭建模板&#xff0c;将FLTK自带的实现搬过来做实验 概述 用fluid搭建UI…

基于物联网设计的疫苗冷链物流监测系统

一、前言 1.1 项目开发背景 随着全球经济的发展和物流行业的不断创新&#xff0c;疫苗和生物制品的运输要求变得越来越高。尤其是疫苗的冷链物流&#xff0c;温度、湿度等环境因素的控制直接关系到疫苗的质量和效力&#xff0c;因此高效、可靠的冷链监控系统显得尤为重要。冷…

JVM对象分配内存如何保证线程安全?

大家好&#xff0c;我是锋哥。今天分享关于【JVM对象分配内存如何保证线程安全?】面试题。希望对大家有帮助&#xff1b; JVM对象分配内存如何保证线程安全? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在JVM中&#xff0c;对象的内存分配是通过堆内存进行的。…

移动光猫怎么自己改桥接模式?

环境&#xff1a; 型号H3-8s 问题描述&#xff1a; 家里宽带用的是H3-8s 光猫&#xff0c;想改桥接模式。 解决方案&#xff1a; 1.默认管理员账号和密码&#xff1a; 账号&#xff1a;CMCCAdmin 密码&#xff1a;aDm8H%MdAWEB页面我试了登陆不了&#xff0c;显示错误 …

大数据Hadoop入门3

第五部分&#xff08;Apache Hive DML语句和函数使用&#xff09; 1.课程内容大纲和学习目标 2.Hive SQL-DML-load加载数据操作 下面我们随机创建文件尝试一下 先创建一个hivedata文件夹 在这个文件夹中写一个1.txt文件 下面使用beeline创建一张表 只要将1.txt文件放在t_1文件…

2025.1.26机器学习笔记:C-RNN-GAN文献阅读

2025.1.26周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 总结 文献阅读 题目信息 题目&#xff1a; C-RNN-GAN: Continuous recurrent neural networks with adversarial training会议期刊&#xff1a; NIPS作者&#xff1a; Olof Mogren发表时间…

基于物联网的火灾报警器设计与实现(论文+源码)

1 总体方案设计 本次基于物联网的火灾报警器&#xff0c;其系统总体架构如图2.1所示&#xff0c;采用STM32f103单片机作为控制器&#xff0c;通过DS18B20传感器实现温度检测&#xff1b;通过MQ-2烟雾传感器实现烟雾检测&#xff1b;.通过火焰传感器实现火焰检测&#xff0c;当…