Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
网络编程中地址格式转换(inet_pton和inet_ntop函数)
地址格式转换
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>int inet_pton(int af , const char * src ,void * dst);
(1)功能:将点分十进制格式的地址字符串转换为网络字节序整型数
(2)返回值:成功返回1,错误返回-1
(3)参数:
----af :转换格式 AF_INET(IPV4)或者AF_INET6(IPV6)---- src :点分格式的地址----- dst:转换后的整型变量的地址
const char * inet_ntop(int af , const void * src , char * dst , socklen_t cnt);
(1)功能:将网络字节序整型数转换为点分格式的IP地址
(2)返回值:成功返回转换后的地址,错误返回NULL
(3)参数:
----af :转换格式 AF_INET(IPV4)或者AF_INET6(IPV6)---- src :整型变量的地址----- dst:用来存储转换后的数据的地址------cnt:存储空间的大小
错误处理
在使用 inet_pton
和 inet_ntop
函数时,可能会出现一些错误。为了确保程序的稳定性,我们需要对这些错误进行适当的处理。通常情况下,我们可以使用 perror
函数来打印出具体的错误信息。下面我们将详细介绍如何处理这两个函数的错误,并给出一个错误处理的例子。
首先,我们需要注意 inet_pton
函数的返回值。当成功将地址字符串转换为网络字节序整数时,它会返回 1;如果输入的地址字符串无效,它会返回 0;发生错误时,它会返回 -1。因此,在调用 inet_pton
后,我们需要检查返回值,以确定是否发生了错误。如果返回值为 -1,我们可以使用 perror
函数打印出具体的错误信息。
同样地,对于 inet_ntop
函数,当成功将网络字节序整数转换为点分格式的 IP 地址时,它会返回转换后的地址;如果发生错误,它会返回 NULL。因此,在调用 inet_ntop
后,我们需要检查返回值,以确定是否发生了错误。如果返回值为 NULL,我们可以使用 perror
函数打印出具体的错误信息。
下面是一个处理错误的示例:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <netdb.h> int main()
{ int addrnum; char addrstring[] = "Invalid IP address"; printf("Address in dotted-quad format is %s\\n", addrstring); if (inet_pton(AF_INET, addrstring, &addrnum) == -1) {perror("inet_pton");exit(EXIT_FAILURE);}char addrstring2[16] = "";if (inet_ntop(AF_INET, &addrnum, addrstring2, 16) == NULL) {perror("inet_ntop");exit(EXIT_FAILURE);}printf("Address in dotted-quad format is %s\\n", addrstring2); return 0;
}
运行结果:
- Address in dotted-quad format is Invalid IP address
- inet_pton: Invalid argument
在上面的示例中,我们使用了一个无效的 IP 地址字符串。当调用 inet_pton
函数时,它会返回 -1,表示发生了错误。我们使用 perror
函数打印出错误信息 “Invalid argument”,这表明输入的地址字符串无效。通过这种方式,我们可以轻松地处理 inet_pton
和 inet_ntop
函数的错误,并确保程序的稳定性。
示例
IPV4
#include <stdio.h>#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <netdb.h>
int main()
{ int addrnum; char addrstring[16] = "127.0.0.1"; printf("address in dotted-quad format is %s\\n",addrstring); inet_pton(AF_INET,addrstring,&addrnum); printf("address in network byteorder integer is 0x%x\\n",addrnum); char addrstring2[16] = ""; if(inet_ntop(AF_INET,&addrnum,addrstring2,16) == NULL) { perror("inet_ntop"); } printf("address in dotted - quad format is %s \\n",addrstring2); return 0; }
运行结果:
[root@rac2 ~]# ./addrformat
- address in dotted-quad format is 127.0.0.1
- address in network byteorder integer is 0x100007f
- address in dotted - quad format is 127.0.0.1
IPV6
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <netdb.h> int main()
{ int addrnum; char addrstring[INET6_ADDRSTRLEN] = "2001:0db8:85a3:0000:0000:8a2e:0370:7334"; printf("IPv6 address in hexadecimal notation is %s\\n", addrstring); struct in6_addr addrnum6;if (inet_pton(AF_INET6, addrstring, &addrnum6) != 1) {perror("inet_pton");exit(EXIT_FAILURE);}char addrstring2[INET6_ADDRSTRLEN] = "";if (inet_ntop(AF_INET6, &addrnum6, addrstring2, INET6_ADDRSTRLEN) == NULL) {perror("inet_ntop");exit(EXIT_FAILURE);}printf("IPv6 address in hexadecimal notation is %s\\n", addrstring2); return 0;
}
在C++ 中的使用示例
在 C++ 中,我们可以使用 RAII(Resource Acquisition Is Initialization)技术和异常处理机制来优雅地使用 inet_pton
和 inet_ntop
函数。下面是一个综合示例,包含注释和异常捕获:
#include <iostream>
#include <stdexcept>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <cstring>class IPAddress
{
public:IPAddress(const std::string& address, int family): family_(family){if (family == AF_INET) {if (inet_pton(AF_INET, address.c_str(), &addr_.ipv4) != 1) {throw std::runtime_error("Invalid IPv4 address: " + address);}}else if (family == AF_INET6) {if (inet_pton(AF_INET6, address.c_str(), &addr_.ipv6) != 1) {throw std::runtime_error("Invalid IPv6 address: " + address);}}else {throw std::runtime_error("Invalid address family");}}std::string toString() const{char buffer[INET6_ADDRSTRLEN];const char* result = inet_ntop(family_, &addr_, buffer, sizeof(buffer));if (result == nullptr) {throw std::runtime_error("Address conversion failed");}return std::string(buffer);}private:union {struct in_addr ipv4;struct in6_addr ipv6;} addr_;int family_;
};int main()
{try {// IPv4 示例IPAddress ipv4("192.168.1.1", AF_INET);std::cout << "IPv4 address: " << ipv4.toString() << std::endl;// IPv6 示例IPAddress ipv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334", AF_INET6);std::cout << "IPv6 address: " << ipv6.toString() << std::endl;}catch (const std::runtime_error& e) {std::cerr << "Error: " << e.what() << std::endl;return 1;}return 0;
}
应用场景
地址转换在网络编程中具有广泛的应用场景。它的主要作用是在不同表示格式之间进行转换,以便于在各种网络通信和地址解析任务中使用。下面我们将简要介绍地址转换在实际应用场景中的一些用途。
-
网络通信:在网络编程中,我们需要与不同的网络设备进行通信。设备之间的通信通常使用网络字节序(大端字节序)表示的整数进行。而人们在日常使用中,通常使用点分十进制(IPv4)或者冒分十六进制(IPv6)表示的 IP 地址。因此,在实际编程过程中,我们需要将人类可读的地址转换为网络字节序整数,或者将网络字节序整数转换为人类可读的地址。这就需要使用
inet_pton
和inet_ntop
等地址转换函数。 -
地址解析:在许多网络应用中,我们需要根据域名来获取 IP 地址。这个过程通常涉及到 DNS 查询,返回的 IP 地址通常以网络字节序整数的形式表示。为了方便展示和使用,我们需要将这些整数地址转换为点分十进制或冒分十六进制表示的字符串。这时,
inet_ntop
函数就派上了用场。 -
跨平台兼容性:不同的计算机系统和网络设备可能使用不同的字节序。为了确保跨平台的兼容性,网络通信通常采用网络字节序(大端字节序)表示整数。地址转换函数如
inet_pton
和inet_ntop
能够确保在不同平台之间进行正确的转换,从而提高了跨平台应用的兼容性。 -
网络诊断与调试:在网络诊断和调试过程中,我们需要处理各种地址信息。地址转换函数可以帮助我们将不同格式的地址信息转换为可读的形式,便于分析和排查问题。
通过以上介绍,我们可以看到地址转换在实际网络编程场景中具有重要的作用。掌握 inet_pton
和 inet_ntop
等地址转换函数的使用,能够帮助我们更加高效地处理网络通信和地址解析等任务。
相关文章:
Linux C/C++ 网络编程中地址格式转换(inet_pton和inet_ntop函数)
网络编程中地址格式转换(inet_pton和inet_ntop函数) 地址格式转换 #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h>int inet_pton(int af , const char * src ,void * dst);(1…...
庖丁解牛函数知识---C语言《2》
目录 前言: 1.嵌套调用函数 2.链式访问 3.函数的声明与定义 4.*递归 5.递归与非递归 ❤博主CSDN:啊苏要学习 ▶专栏分类:C语言◀ C语言的学习,是为我们今后学习其它语言打好基础,C生万物! 开始我们的C语言之旅吧…...
Git 使用教程:最详细、最正宗手把手教学(万字长文)
目录 一:Git二:SVN与Git的的区别三、安装Git四:常规操作五:远程仓库六:创建与合并分支七:bug分支八:多人协作九:git可视化工具 Git Git 是一种分布式版本控制系统,用于…...
【华为OD机试 2023最新 】最优资源分配/芯片资源占用(C语言题解 100%)
文章目录 题目描述输入描述输出描述备注用例题目解析代码思路C语言题目描述 某块业务芯片最小容量单位为1.25G,总容量为M*1.25G,对该芯片资源编号为1,2,…,M。该芯片支持3种不同的配置,分别为A、B、C。 配置A:占用容量为 1.25 * 1 = 1.25G配置B:占用容量为 1.25 * 2 =…...
markdown二元运算符
符号markdown名称 \pm \pm正负/加减 ∓ \mp ∓\mp负正/减加 \times \times乘号 ⋅ \cdot ⋅\cdot点乘号 \div \div除号 ∣ \mid ∣\mid整除 ∤ \nmid ∤\nmid不整除 ⊕ \oplus ⊕\oplus异或...
【华为/华三】PPP
NCP network阶段 用于协商网络层参数,IPCP静态协商IP地址(即互推地址)动态协商叫做获得地址 Q:为什么PPP两端,可以不在一个网段内,也能够通信? A:因为PPP中的NCP会通过IPCP协商IP…...
【Java笔试强训 9】
🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 一、选择题 二、编程题 🔥另类加法…...
【C++】STL标准库之list
STL标准库之list list类的简介常用的list类的接口构造迭代器容量访问修改 list和vector的区别 list类的简介 list是一种序列式容器,可以在任意位置插入和删除元素,并且其时间复杂度为O(1),在底层,list是双向链表结构,…...
Nomogram | 盘点一下绘制列线图的几个R包!~(二)
1写在前面 不知道各位小伙伴的五一假期过的在怎么样,可怜的我感冒了。😷 今天继续之前没有写完的列线图教程吧,再介绍几个制作列线图的R包。🤠 2用到的包 rm(list ls())library(tidyverse)library(survival)library(rms)library(…...
Django之定时任务django-crontab
Django之定时任务django-crontab crontab安装django-crontab注册应用定时时间格式定时时间示例设置定时任务符号方法解决crontab中文问题管理定时任务注意 crontab Django可以使用第三方库如django-crontab来实现定时任务的调度。该库允许使用类似于crontab文件格式的语法指定任…...
linux常见命令
ls:列出当前目录下的所有文件和子目录 cd:切换当前工作目录,例如 cd /home/user 进入 /home/user 目录 pwd:显示当前工作目录的路径 mkdir:创建一个新目录,例如 mkdir newdir 创建一个名为 newdir 的目录…...
【14.HTML-移动端适配】
移动端适配 1 布局视口和视觉视口1.1 设置移动端布局视口宽度 2 移动端适配方案2.1 rem单位动态html的font-size;2.2 vw单位2.3 rem和vw对比2.4 flex的弹性布局 1 布局视口和视觉视口 1.1 设置移动端布局视口宽度 避免布局视口宽度默认980px带了的缩放问题,并且禁止…...
平衡二叉树旋转机制
概念 平衡二叉树的旋转机制是一种通过对树进行旋转操作来保持其平衡的方法。 分类 平衡二叉树的旋转机制包括两种基本类型的旋转:左旋和右旋,以及它们的组合。 左旋 左旋是将一个节点的右子节点旋转到它的位置上,同时将该节点移到其左侧&…...
深入浅出C++ ——C++11
文章目录 一、C11简介二、列表初始化二、声明四、范围for循环五、STL中的变化六、右值引用和移动语义1. 什么是左值?什么是左值引用?2. 左值引用与右值引用比较3. 右值引用使用场景和意义4. 完美转发 新的类功能默认成员函数类成员变量初始化defaultdele…...
智能座舱3.0阶段,看全球巨头如何打造更具“价值”的第三空间
面向中国这一全球最大的汽车电动化与智能化单一市场,作为全球第七大汽车技术供应商的FORVIA佛瑞亚集团开始全面发力。 在2023年上海国际车展上,FORVIA佛瑞亚携旗下佛吉亚与海拉一系列突破性技术和互动体验亮相,展示了对电气化与能源管理、安…...
【Linux】入门介绍
🌱博客主页:大寄一场. 🌱系列专栏:Linux 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 目录 前言 Linux背景介绍 1.发展史 UNIX发展的历史 Linux发展历史 2. 开源 3. 官网 4. 企业应用现状 5. 发行版…...
【Python】序列类型②-元组
文章目录 1.元组简介2.元组的定义2.1定义只有一个元素的元组 3.元组的下标访问4.元组的常用方法5.使用in判断是否存在元素6.多元赋值操作 1.元组简介 元组和列表一样可以存放多个,不同数据类型的元素 与列表最大的不同就是:列表是可变的,而元组不可变 2.元组的定义 元组的定义:…...
循环的数字
循环的数字 题目描述 你曾经因为看见一样的东西一遍又一遍地重复、循环而对电视节目感到厌烦么?好吧,虽然我并不关心电视节目的好坏,不过有时却也很像那样不断循环的数字。 让我们假定两个不同的正整数 ( n , m ) (n, m) (n,m) 是循环的&…...
MySQL查询之聚合函数查询
0. 数据源 student.sql文件。 /*Navicat Premium Data TransferSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80016Source Host : localhost:3306Source Schema : testdbTarget Server Type : MySQLTa…...
普通2本,去过字节外包,到现在年薪25W+的测试开发,我的2年转行心酸经历...
个人简介 我是一个普通二本大学机械专业毕业,17年毕业,19年转行,目前做IT行业的软件测试已经有3年多,职位是高级测试工程师,坐标上海… 我想现在我也有一点资格谈论关于转行这个话题;希望你在决定转行之前…...
util.callbackify
util.callbackify(original) 将 async 异步函数(或者一个返回值为 Promise 的函数)转换成遵循异常优先的回调风格的函数,例如将 (err, value) > ... 回调作为最后一个参数。 在回调函数中,第一个参数为拒绝的原因(如…...
解决使用CLIP模型时TypeError: Cannot handle this data type: (1, 1, 224, 224), |u1
想提供Huggingface的transformer库实现多模态模型CLIP的推断,结果报错 (myenv) rootd27d1ff1836c:/home/model_test# python3 CLIP.py ftfy or spacy is not installed using BERT BasicTokenizer instead of ftfy. Traceback (most recent call last): File “/hom…...
Mysql第二章 多表查询的操作
这里写自定义目录标题 一 外连接与内连接的概念sql99语法实现 默认是内连接sql99语法实现左外连接,把没有部门的员工也查出来sql99语法实现右外连接,把没有人的部门查出来sql99语法实现满外连接,mysql不支持这样写mysql中如果要实现满外连接的…...
ESP32-CAM:TinyML 图像分类——水果与蔬菜
目录 故事 硬件参数: 在 Arduino IDE 上安装 ESP32-Cam 使用 BLINK 测试电路板 测试无线网络 运行您的 Web 服务器 水果与蔬菜-图像分类 下载数据集 使用 Edge Impulse Studio 训练模型...
如何防止订单重复支付
想必大家对在线支付都不陌生,今天和大家聊聊如何防止订单重复支付。 看看订单支付流程 我们来看看,电商订单支付的简要流程: 订单钱包支付流程 从下单/计算开始: 下单/结算:这一步虽然不是直接的支付起点,但…...
不是那么快乐的五一
大家好,我是记得诚。 五一假期结束了,明天开始上班了。 这个假期没休息好,也没出去玩。 放假前一天,接到通知让加班。 第一天就去公司加班了,属实很难受,我心想如果别人有了出远门的安排,还…...
Maven命令和配置详解
Maven命令和配置详解 1. pom基本结构2. build基本结构3. Maven命令详解3.1 打包命令3.2 常用命令3.3 批量修改版本-父子pom4. Maven配置详解4.1 settings.xml4.2 项目内的maven工程结构Maven POM构建生命周期工程实践1. pom基本结构 <?xml versi...
P3029 [USACO11NOV]Cow Lineup S 双指针 单调队列
“五一”小长假来了趟上海,在倒数第二天终于有时间做了一会儿题目,A了之后过来写一篇题解 【问题描述】 农民约翰雇一个专业摄影师给他的部分牛拍照。由于约翰的牛有好多品种,他喜欢他的照片包含每个品种的至少一头牛。 约翰的牛都站在一条沿…...
数据结构与算法之链表: Leetcode 83. 删除排序链表中的重复元素 (Typescript版)
删除排序链表中的重复元素 https://leetcode.cn/problems/remove-duplicates-from-sorted-list/ 描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 示例 1 输入:head [1,1,2] 输出&…...
ubuntu16.04升级到20.04后报错 By not providing “FindEigen.cmake“
编译问题: CMake Error at modules/perception/lidar/CMakeLists.txt:14 (find_package): By not providing "FindEigen.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Eigen&…...
网站备案 选项/线上推广有哪些
当前环境:Oracle enterprise Linux 5.6Oracle 10.2.0.1数据库安装成功后,如果操作系统重启,数据库不会自动启动,以下步骤将实现oralce数据库随操作系统自动启动。一、使用root用户修改/etc/oratab 文件:$ vi /etc/orat…...
wordpress 自动上传插件/郑州搜狗关键词优化顾问
我有一个PHP REST API,可以托管Amazon S3中的所有图像.我正在寻找一个插件或技巧,使用GET参数来调整图像大小.例如:http://my-bucket.s3.amazon.com/image.jpg?width300&height300我找到了this plugin,但我的团队成员说它是基于ASP.NET的,不适合我的PHP API项目…...
单位网站维护 网站建设岗位/seo顾问服务咨询
一、开关电源的电路组成开关电源的主要电路是由输入电磁干扰滤波器(EMI)、整流滤波电路、功率变换电路、PWM控制器电路、输出整流滤波电路组成。辅助电路有输入过欠压保护电路、输出过欠压保护电路、输出过流保护电路、输出短路保护电路等。开关电源的电路组成方框图如下&#…...
游戏运营备案官方网站/云盘搜
赋值语句的是内存地址引用,不是拷贝拷贝是导入copy包,分copy和deepcopy两种,即浅拷贝和深拷贝对于非嵌套数据 copy.copy 和 copy.deepcopy 没有区别 都会开辟新空间 存储数据有嵌套的数据 copy.copy没有办法保证数据的独立性,拷贝第一层的数据…...
网站模板后台怎么做/营销咨询服务
10.3去看了穗港澳动漫展,08年广州难得的一次动漫展......比较近距离地看了下川みくに,气氛很好。贴个相册地址,有兴趣的可以去看下哇。[url]http://photo.163.com/photos/squareram/160820460/[/url]转载于:https://blog.51cto.com/zeroyang/…...
网站keyword如何排列/金华百度推广公司
#从新下载 下载完才覆盖原来已有 scp zhangyong13:/datM_BL-HiC_Rep2/hic_results/data/MKO_DM_BL-HiC_Rep2/MKO_DM_BL-HiC_Rep2_mm9.bwt2pairs.DEPairs /mnt/d/myodvalid/ ####u参数同步,不覆盖已有文件,会跳过! rsync -avzut --progress z…...