当前位置: 首页 > news >正文

Linux网络编程---IP 地址格式转换函数

Linux网络编程—IP 地址格式转换函数

  我们更容易阅读的IP地址是以点分十进制表示的,例如:192.168.5.10 ,这是一种字符串的形式,但是计算器所需要的IP地址是以二进制进行表示,这便需要我们在点分十进制字符串和二进制地址之间进行转换。
  点分十进制字符串和二进制地址之间的转换函数主要有:inet_aton、inet_addr、inet_ntoa、inet_ntop、inet_pton 这五个,在使用它们时需要包含头文件<sys/socket.h>、<arpa/inet.h>以及<netinet/in.h>。

1 inet_aton、inet_addr、inet_ntoa 函数

  这些函数可将一个 IP 地址在点分十进制表示形式和二进制表示形式之间进行转换,但是我们现在基本不用这些函数。
  我们将介绍下述的两个函数完成我们的点分十进制字符串和二进制地址的转化。

2 inet_ntop 、inet_pton 函数

  inet_ntop()、inet_pton()与 inet_ntoa()、inet_aton()类似,但它们还支持 IPv6 地址。它们将二进制 Ipv4 或Ipv6 地址转换成以点分十进制表示的字符串形式,或将点分十进制表示的字符串形式转换成二进制 Ipv4 或Ipv6 地址。
  使用这两个函数需要包含头文件<arpa/inet.h>。

2.1 inet_pton()函数

inet_pton()函数将点分十进制表示的字符串形式转换成二进制 Ipv4 或 Ipv6 地址,它的函数原型如下所示:

int inet_pton(int af, const char *src, void *dst);
  • 参数 af 必须是 AF_INET 或 AF_INET6,AF_INET 表示待转换的 Ipv4地址,AF_INET6 表示待转换的是 Ipv6 地址;
  • 如果参数 af 被指定为 AF_INET,则参数 dst 所指对象应该是一个 struct in_addr 结构体的对象;如果参数 af 被指定为 AF_INET6,则参数 dst 所指对象应该是一个 struct in6_addr 结构体的对象。
  • 字符串 src 表示需要转化的二进制,参数 dst 用于存放转化后得到的地址。

使用示例:

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>#define IPV4_ADDR "192.168.5.10"int main(void)
{struct in_addr addr;inet_pton(AF_INET, IPV4_ADDR, &addr);printf("ip addr: 0x%x\n", addr.s_addr);exit(0);
}

在这里插入图片描述

2.2 inet_ntop()函数

inet_ntop()函数执行与 inet_pton()相反的操作,函数原型如下所示:

const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
  • 参数 src 应指向一个 struct in_addr 结构体对象或 struct in6_addr 结构体对象,依据参数 af 而定。
  • 函数inet_ntop()会将参数 src 指向的二进制 IP 地址转换为点分十进制形式的字符串,并将字符串存放在参数 dts 所指的缓冲区中,参数 size 指定了该缓冲区的大小。

示例:

#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
int main(void)
{struct in_addr addr;char buf[20] = {0};addr.s_addr = 0xa05a8c0;inet_ntop(AF_INET, &addr, buf, sizeof(buf));printf("ip addr: %s\n", buf);exit(0);
}

在这里插入图片描述

相关文章:

  • L3上云01 | 分布式、微服务概念
  • 手机常用的root方案
  • 嵌入式-Stm32-江科大基于标准库的GPIO的八种模式
  • vue2 el-table行悬停时弹出提示信息el-popover
  • XXL-Job的搭建接入Springboot项目(详细)
  • RTSP/Onvif安防视频云平台EasyNVR迁移盘符后启动异常的问题排查与解决
  • HashMap学习和线程安全的HashMap
  • 蓝桥杯每日一题----货物摆放
  • web架构师编辑器内容-编辑器组件图层面板功能开发-锁定隐藏、键盘事件功能的开发
  • 中级Python面试问题
  • 概率论与数理统计————3.随机变量及其分布
  • STM32F103标准外设库——中断应用/事件控制器(六)
  • 线性代数的学习和整理23:用EXCEL计算 向量/向量组的点乘 (内积) (建设ing)
  • 数据集成时表模型同步方法解析
  • postman后端测试时invalid token报错+token失效报错解决方案
  • [case10]使用RSQL实现端到端的动态查询
  • 345-反转字符串中的元音字母
  • Angular4 模板式表单用法以及验证
  • es6要点
  • IOS评论框不贴底(ios12新bug)
  • Javascript编码规范
  • Java到底能干嘛?
  • Java精华积累:初学者都应该搞懂的问题
  • mysql外键的使用
  • vuex 学习笔记 01
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 给新手的新浪微博 SDK 集成教程【一】
  • 关于 Cirru Editor 存储格式
  • 官方解决所有 npm 全局安装权限问题
  • 开源地图数据可视化库——mapnik
  • 使用 @font-face
  • 使用common-codec进行md5加密
  • 小李飞刀:SQL题目刷起来!
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 终端用户监控:真实用户监控还是模拟监控?
  • 《天龙八部3D》Unity技术方案揭秘
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • zabbix3.2监控linux磁盘IO
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #1015 : KMP算法
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (四)模仿学习-完成后台管理页面查询
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .Net Core 中间件验签
  • .Net Remoting常用部署结构
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .NET企业级应用架构设计系列之结尾篇
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作