网络编程中有关字节序、地址的转换

大家好,这里是小缺,一名对嵌入式软件开发充满热情的探索者。这一篇文章主要内容是带大家了解网络编程中的字节序和地址转换。

1.1 字节序概述

字节序概念

字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序。

分类

小端格式:将低位字节数据存储在低地址

大端格式:将高位字节数据存储在低地址

在进行跨平台或网络数据传输时,由于不同系统可能采用不同的字节序,因此需要进行字节序的转换,以确保数据的正确性。在网络通信中,通常采用大端字节序作为标准,也称为网络字节序。

如何判断当前系统的字节序:

#include <stdio.h>//判断当前系统的字节序union un
{int a;char b;
};int main(int argc, char const *argv[])
{union un myun;myun.a = 0x12345678;printf("a = %#x\n", myun.a);printf("b = %#x\n", myun.b);if(myun.b == 0x78){printf("小端存储\n");}else {printf("大端存储\n");}return 0;
}

运行结果

1.2 字节序转换函数 

1、网络协议指定了通讯字节序—大端

2、只有在多字节数据处理时才需要考虑字节序

3、运行在同一台计算机上的进程相互通信时,一般不用考虑字节序

4、异构计算机之间通讯,需要转换自己的字节序为网络字节序

在需要字节序转换的时候一般调用特定字节序转换函数

host ‐‐> network

 1 ‐‐ htonl#include <arpa/inet.h>
uint32_t htonl(uint32_t hostint32); 
功能:将32位主机字节序数据转换成网络字节序数据
参数:hostint32:待转换的32位主机字节序数据
返回值:成功:返回网络字节序的值
 2 ‐‐ htons#include <arpa/inet.h>uint16_t htons(uint16_t hostint16);
功能:将16位主机字节序数据转换成网络字节序数据
参数:uint16_t:unsigned short inthostint16:待转换的16位主机字节序数据
返回值:成功:返回网络字节序的值

network ‐‐> host

 3 ‐‐ ntohl#include <arpa/inet.h>uint32_t ntohl(uint32_t netint32);
功能:将32位网络字节序数据转换成主机字节序数据
参数:uint32_t: unsigned intnetint32:待转换的32位网络字节序数据
返回值:成功:返回主机字节序的值
 4 ‐‐ ntohs#include <arpa/inet.h>uint16_t ntohs(uint16_t netint16);功能:将16位网络字节序数据转换成主机字节序数据参数:uint16_t: unsigned short intnetint16:待转换的16位网络字节序数据返回值:成功:返回主机字节序的值

1.3 地址转换函数

在编程中,我们经常需要将点分十进制表示的IP地址(如"192.168.1.1")转换为整型数据,以便于在网络通信或者存储时使用。同样,我们也需要将整型数据转换为点分十进制表示的IP地址,以便于人类阅读和理解。

1.3.1 inet_pton()

字符串ip地址转整型数据

#include <arpa/inet.h>int inet_pton(int family,const char *strptr, void *addrptr);功能:将点分十进制数串转换成32位无符号整数参数:family 协议族AF_INET IPV4网络协议AF_INET6 IPV6网络协议strptr 点分十进制数串addrptr  32位无符号整数的地址返回值:成功返回  1失败返回  其它

案例:

#include <stdio.h>
#include <arpa/inet.h>
int main()
{char ip_str[]="192.168.3.103";unsigned int ip_int = 0;unsigned char *ip_p = NULL;//将点分十进制ip地址转化为32位无符号整形数据inet_pton(AF_INET,ip_str,&ip_int);printf("ip_int = %d\n",ip_int);ip_p = (char *)&ip_int;printf("in_uint = %d,%d,%d,%d\n",*ip_p,*(ip_p+1),*(ip_p+2),*(ip_p+3));return 0;
}

 运行结果

1.3.2 inet_ntop() 

#include <arpa/inet.h>const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len);

这个函数声明了 inet_ntop 函数,它用于将32位无符号整数表示的IP地址转换为点分十进制字符串表示的IP地址。

  • family:表示协议族,对于IPv4地址,使用 AF_INET,对于IPv6地址,使用 AF_INET6
  • addrptr:指向要转换的32位无符号整数表示的IP地址的指针。
  • strptr:指向用于存储转换后的点分十进制字符串表示的IP地址的缓存区的指针。
  • len:缓存区的长度。对于IPv4地址,建议使用 INET_ADDRSTRLEN(其值为16)作为缓存区长度;对于IPv6地址,建议使用 INET6_ADDRSTRLEN(其值为46)作为缓存区长度。

函数的返回值是转换后的点分十进制字符串表示的IP地址的首地址。

如果转换成功,则返回字符串的首地址;

如果转换失败,则返回 NULL

案例

#include <stdio.h>
#include <arpa/inet.h>
int main()
{unsigned char ip_int[]={192, 168, 3, 103};char ip_str[16] = ""; //"192.168.3.103"inet_ntop(AF_INET, &ip_int, ip_str, 16);printf("ip_s = %s\n", ip_str);return 0;
}

这段代码演示了如何使用 inet_ntop 函数将一个以字节数组形式存储的IP地址(IPv4)转换为点分十进制字符串形式。

执行结果

 

1.3.3 inet_addr()和inet_ntoa()

这两个函数只能用在ipv4地址的转换

 #include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>in_addr_t inet_addr(const char *cp);功能:将点分十进制ip地址转化为整形数据参数:
cp:点分十进制的IP地址返回值: 成功:整形数据char *inet_ntoa(struct in_addr in);功能:将整形数据转化为点分十进制的ip地址参数:in:保存ip地址的结构体返回值:成功:点分十进制的IP地址

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

详细介绍如何使用YOLOv9 在医疗数据集上进行实例分割-含源码+数据集下载

深度学习彻底改变了医学图像分析。通过识别医学图像中的复杂模式,它可以帮助我们解释有关生物系统的重要见解。因此,如果您希望利用深度学习进行医疗诊断,本文可以成为在医疗数据集上微调YOLOv9 实例分割的良好起点。 实例分割模型不是简单地将区域分类为属于特定细胞类型,…

标贝语音识别技术在金融领域中的应用实例

随着语音识别技术与文本挖掘、自然语言处理等技术的不断融合&#xff0c;智能语音交互技术在金融领域中爆发了出巨大的应用潜力。标贝科技根据自身与金融领域合作的经验为大家梳理出以下几点智能语音识别技术在金融领域中的应用实例。 一、智能柜台服务 语音识别的主要功能就…

ctfshow web78 获取flag(用老版的火狐浏览器)

题&#xff1a; 第一种&#xff1a;利用input伪协议 ,获取到flag ?filephp://input POST data <?php system(tac ls) ?> 第二种&#xff1a;利用flter协议,获取到flag https://21d9e58a-c0fd-47ea-a9c4-d875100f2fdb.challenge.ctf.show/?filephp://filter/readcon…

大语言模型在人类层面预测未来的研究与应用

概述 这项研究将探讨语言模型&#xff08;LM&#xff09;能否预测未来事件。在这项研究中&#xff0c;将开发一个系统来自动收集信息、生成和汇总预测结果。将从一个竞争性预测平台收集有关问题的数据&#xff0c;以评估 LM 的预测能力。结果表明&#xff0c;LM 可以与具有竞争…

# 使用 spring boot 时,@Autowired 注解 自动装配注入时,变量报红解决方法:

使用 spring boot 时&#xff0c;Autowired 注解 自动装配注入时&#xff0c;变量报红解决方法&#xff1a; 1、使用 Resource 代替 Autowired 注解&#xff0c;根据类型注入改为根据名称注入&#xff08;建议&#xff09;。 2、在 XXXMapper 上添加 Repository 注解&#xff0…

【MATLAB】解决不同版本MATLAB出现中文乱码的问题

解决不同版本MATLAB出现中文乱码的问题 方法1&#xff1a;更改保存类型为GBK方法2&#xff1a;记事本打开方法3&#xff1a;Notepad参考 低版本matlab打开高版本Matlab的.m文件时&#xff0c;出现中文乱码问题。比如下图&#xff1a; 出现原因为&#xff1a; 编码格式不统一问…

使用Redis Topic广播模式,实现类似mq消息的发布和订阅

一、背景 不同的mq中间件&#xff0c;不仅支持发送队列消息&#xff0c;也都可以发送广播消息。 有时候&#xff0c;我们的业务逻辑需要发送广播消息&#xff0c;却不想引入mq中间件时&#xff0c;推荐你使用redis的topic机制来实现。 原因是&#xff1a;它比较轻量级&#x…

为了不让共享单车进城,出租车司机剑走偏锋杀红了眼……

最近&#xff0c;小柴上网冲浪的时候&#xff0c;刷到一些看上去非常离谱的画面&#xff0c;不知道柴油们有没有刷到&#xff0c;大概是下面这样的&#xff0c;一道道出租车堆起来的钢铁长城…… 大量的出租车司机不出车&#xff0c;竟然联起手来&#xff0c;将车停在路边&…

Vue生命周期都有哪些?

定义 Vue的生命周期就是实例从创建到销毁的一个过程&#xff0c;即从创建、初始化数据、编译模板、挂载Dom($el)->渲染、更新->渲染&#xff0c;卸载等一系列的过程。el是挂载点如<div id"app"></div>。 Vue的生命周期分为八个阶段 1.beforeCreate…

在线教程|零门槛部署 Llama 3,70B 版本只占 1.07G 存储空间,新用户免费体验 8B 版本

4 月 18 日&#xff0c;Meta 宣布开源 Llama 3&#xff0c;这个号称「迄今为止最好的开源大模型」一经发布&#xff0c;立刻引爆科技圈&#xff01; 发布当天恰逢斯坦福大学教授、AI 顶尖专家吴恩达的生日&#xff0c;作为 AI 开源倡导者&#xff0c;他激动地发文表示&#xff…

Adobe推出AI视频超分辨率工具VideoGigaGAN

&#x1f989; AI新闻 &#x1f680; Adobe推出AI视频超分辨率工具VideoGigaGAN 摘要&#xff1a;Adobe公司最新推出的AI工具VideoGigaGAN&#xff0c;利用上采样技术将视频分辨率从128128提升至10241024。这一工具基于GigaGAN模型开发&#xff0c;专注于生成视频超分辨率&am…

华为手机回归之路:时隔13个季度,中国区市场份额重回第一 | 最新快讯

华为手机回归市场的速度&#xff0c;超出了市场预期。 根据市场分析机构 Canalys 发布的报告显示&#xff0c;2024 年第一季度&#xff0c;中国大陆智能手机市场时隔两年首次回暖&#xff0c;出货量与去年同期持平&#xff0c;达 6770 万台。其中&#xff0c;华为经历了 13 个季…

MySQL 高级 - 第一章 | 字符集、大小写规范与sql_mode的合理设置

目录 前言一、字符集1.1 数据库中的默认字符集1.2 各级别的字符集1.3 字符集与比较规则1.4 字符集设置1.5 已有库表字符集变更1.6 请求到响应过程中字符集的变化 二、大小写规范2.1 Windows 和 Linux 平台区别2.2 Linux 下大小写规则设置2.3 SQL 编写建议 三、sql_mode 的合理设…

AutoMQ 系统测试体系揭秘

01 前言 Apache Kafka 有着比较完备的自测体系。除了常规的单元测试和集成测试以外&#xff0c;Apache Kafka 还有着 1000 的“系统集成和性能测试”&#xff08;以下简称系统测试&#xff09;。系统测试会拉起一套真实的 Kafka 集群&#xff0c;并模拟用户使用 Kafka 集群的方…

2024最佳游戏引擎排行

游戏产业几十年来一直是一个大生意&#xff0c;而且发展势头迅猛。据估计&#xff0c;全球游戏市场在 2025 年每年将达到 5031.4 亿美元&#xff0c;2023 年为 3960 亿美元。 尽管如今有市面上有各种各样的解决方案&#xff0c;但游戏开发人员和管理者在选择适合他们需求的游戏…

为什么很多企业都使用OV SSL证书

我们要了解什么是SSL OV证书 SSL OV证书&#xff0c;即组织验证型SSL证书&#xff0c;它要求证书颁发机构对申请证书的组织进行身份验证&#xff0c;确认组织的真实性后&#xff0c;才会发放证书。这种验证方式提高了安全性&#xff0c;因为它确保了证书背后的实体是真实存在的…

小猫咪邮件在线发送系统源码v1.1,支持添加附件

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 小猫咪邮件在线发送系统源码v1.1&#xff0c;支持添加附件 一款免登录发送邮件&#xff0c;支持发送附件&#xff0c;后台可添加邮箱,前台可选择发送邮箱 网站数据采取本地保存&…

systemserver为啥很少同步跨进程调用app/DeadSystemException相关问题分析套路

背景&#xff1a; 有学员分享了一个问题&#xff0c;说monkey测试过程中有一系列问题属于同类的&#xff0c;具体看如下截图&#xff1a; 可以看到这里的有很多应用都进行了crash&#xff0c;而且crash原因居然都是写着 DeadSystemException: The system died; earlier logs …

图技术解读 | 区别原生与非原生图数据库

> 引言 所谓“样样皆通,样样稀松”&#xff0c;通常用来形容一个人擅长多个方面&#xff0c;但哪个方面都不出色。这话同样适用于数据库行业。 随着时代与技术的发展&#xff0c;数据库业内出现了各种类型的数据库&#xff0c;分别具备其独特的特点和适用场景。例如关系型…

前端请求没问题,后端正常运行,但查不出数据

写代码时写得快了些&#xff0c;Orders.的订单状态写错了CONFIRMED 改成COMPLETED