浅谈 Linux 网络编程 - 网络字节序

文章目录

    • 前言
    • 核心知识
    • 关于 小端法
    • 关于 大端法
    • 网络字节序的转换 函数

前言

在进行 socket 网络编程时,会用到字节流的转换函数、例如 inet_pton、htons 等,那么为什么要用到这些函数呢,本篇主要就是对这部分进行介绍。

核心知识

重点需要记住的就是以下三点:
① 本地的数据和网络的数据,其排列方式是有区别的。本地数据存储 采用的是 “小端法”,网络数据流 采用的是 “大端法” 。(这就会导致 本地字节序 和 网络字节序 之间需要做转换)

② 记住两个 IP 地址转换函数
inet_pton(): 该函数用于将点分十进制字符串形式的IP地址,转换为网络字节序的二进制形式IP地址。通常在需要从用户输入的IP地址解析为网络字节序形式时使用。

inet_ntop(): 该函数用于将网络字节序的二进制形式IP地址,转换为点分十进制字符串形式的IP地址。通常在需要将IP地址转换为可读性更好的形式(如日志输出)时使用。

记住二者使用场景:
例如,在接收到来自客户端的连接请求时,通常会使用 inet_ntop() 将客户端的IP地址转换为可读性更好的字符串格式进行显示或记录。而在需要把用户输入的IP地址转换为网络字节序进行套接字地址填充时,则会使用 inet_pton()。

③ 记住几个能完成 网路字节序 和 主机字节序 转换的库函数
在这里插入图片描述
注意,以上四个函数是进行整数之间的转换。

h 表示 host,n:network,l:32 位长整型,s:16 位短整型。

例如 htonl,用于将 32位主机字节序 的整数转换为 网络字节序 (大端字节序)表示。(结合 INADDR_ANY 参数可用于 IP 转换)。

例如 htons,用于将 16位主机字节序 的整数转换为 网络字节序 (大端字节序)表示。(结合 SERV_PORT 参数可用于 端口 转换)。

以上的 转换函数 为什么只提到了 IP 和 端口 的转换呢?
因为 IP 地址 + 端口号,可以在网络环境中,唯一标识一个进程。

关于 小端法

本地数据流,高位存高地址。低位存低地址。 int a = 0x12345678
在这里插入图片描述

关于 大端法

网络数据流, 高位存低地址。低位存高地址。int a = 0x12345678
在这里插入图片描述
本地存储的数据 和 网络字节序 的存储方式不一致,这会导致在进行 socket 网络通信时,需要做字节序的转换。

为什么不采用一致的存储方案,而是分成 大端法 和 小端法,这涉及到历史原因。

网络字节序的转换 函数

可以调用以下库函数做 网络字节序主机字节序 的转换。
在这里插入图片描述
h 表示 host,n:network,l:32 位长整型,s:16 位短整型。

例如 htonl,用于将 32位主机字节序 的整数转换为 网络字节序 (大端字节序)表示。(结合 INADDR_ANY 参数可用于 IP 转换)。

例如 htons,用于将 16位主机字节序 的整数转换为 网络字节序 (大端字节序)表示。(结合 SERV_PORT 参数可用于 端口 转换)。

#include <arpa/inet.h>

int inet_pton(int af, const char *src, void *dst); 本地字节序(string IP) —> 网络字节序

		af:AF_INET、AF_INET6src:传入,IP地址(点分十进制)dst:传出,转换后的 网络字节序的 IP地址。 返回值:成功: 1异常: 0, 说明src指向的不是一个有效的ip地址。失败:-1

const char * inet_ntop(int af, const void *src, char *dst, socklen_t size); 网络字节序 —> 本地字节序(string IP)

		af:AF_INET、AF_INET6src: 网络字节序IP地址dst:本地字节序(string IP)size: dst 的大小。返回值: 成功:dst。 	失败:NULL

提问:
htonl 函数也能将本地字节序转换成网络字节序。那么,htonl 函数 和 inet_pton 函数有什么区别呢

解答:
htonl() 和 inet_pton() 这两个函数在功能上是不同的:

htonl(): 该函数用于将32位主机字节序的整数转换为网络字节序(大端字节序)表示。它通常用于处理整数类型数据的字节序转换。

inet_pton(): 该函数用于将点分十进制字符串形式的IP地址转换为二进制格式的网络字节序IP地址。它将一个IP地址从人类可读的字符串格式转换为计算机网络设备能够理解的二进制格式。

总结来说,
htonl() 用于 整数类型数据 的 字节序 转换。
inet_pton() 用于 IP地址(字符串) 表示形式和 网络字节序 之间的转换。

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

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

相关文章

韩国突发:将批准比特币ETF

作者&#xff1a;秦晋 韩国两党宣布将批准比特币ETF。比特币也再次成为竞选的宠儿。 4月10日&#xff0c;韩国将迎来每隔4年而进行的一次立法大选。在大选之前&#xff0c;现执政党与反对党都承诺将批准比特币ETF。 我们知道&#xff0c;比特币的主要受众群体以年轻人居多。此前…

idea打包报错,clean、package报错

一、idea在打包时&#xff0c;点击clean或package报错如下&#xff1a; Error running ie [clean]: No valid Maven installation found. Either set the home directory in the configuration dialog or set the M2_HOME environment variable on your system. 示例图&#xf…

揭示预处理中的秘密!(二)

目录 ​编辑 1. #运算符 2. ##运算符 3. 命名约定 4. #undef 5. 命令行定义 6. 条件编译 7. 头文件的被包含的方式 8.嵌套文件包含 9. 其他预处理指令 10. 完结散花 悟已往之不谏&#xff0c;知来者犹可追 …

androidapp开发语言,已获千赞

初级 初级研发工程师的定义是掌握基础的Android知识&#xff0c;能够独立完成一个功能&#xff0c;工作年限大概在1-2年&#xff0c;这个层级大部分人通过看一些资料书籍再经过项目练习很快可以达到。这个级别的人往往需要掌握如下一些技能&#xff1a; 掌握Android 四大组件…

Nginx网络服务六-----IP透传、调度算法和负载均衡

1.实现反向代理客户端 IP 透传 就是在日志里面加上一个变量 Module ngx_http_proxy_module [rootcentos8 ~]# cat /apps/nginx/conf/conf.d/pc.conf server { listen 80; server_name www.kgc.org; location / { index index.html index.php; root /data/nginx/html/p…

等保2.0高风险项全解析:判定标准与应对方法

引言 所谓高风险项&#xff0c;就是等保测评时可以一票否决的整改项&#xff0c;如果不改&#xff0c;无论你多少分都会被定为不合格。全文共58页&#xff0c;写得比较细了&#xff0c;但是想到大家基本不会有耐心去仔细看的&#xff08;凭直觉&#xff09;。这几天挑里边相对…

【大数据】Flink 内存管理(一):设置 Flink 进程内存

《Flink 内存管理》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 4 篇文章&#xff1a; Flink 内存管理&#xff08;一&#xff09;&#xff1a;设置 Flink 进程内存Flink 内存管理&#xff08;二&#xff09;&#xff1a;JobManager 内存分配&#xff08;含实际…

智慧校园|智慧校园管理小程序|基于微信小程序的智慧校园管理系统设计与实现(源码+数据库+文档)

智慧校园管理小程序目录 目录 基于微信小程序的智慧校园管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、微信小程序前台 2、管理员后台 &#xff08;1&#xff09;学生信息管理 &#xff08;2&#xff09; 作业信息管理 &#xff08;3&#xff09;公告…

shader学习记录——融合、融球效果

融合、融球效果shader&#xff0c;重点在等势面公式上 Shader "Custom/MetaballsShader" {Properties{_MainTex ("Texture", 2D) "white" {}_Color("Color",Color) (1,1,1,1)}SubShader{Tags { "RenderType""Opaque…

什么是去中心化云计算?

去中心化云计算是一种新型的云计算方式&#xff0c;它与传统的中心化云计算不同&#xff0c;将数据和计算任务分布到多个节点上&#xff0c;而不是将数据集中存储在中心服务器上。这种云计算方式具有许多优势&#xff0c;包括提高数据安全性、降低运营成本、增强可扩展性和灵活…

【C语言】学生宿舍信息管理系统

目录 项目说明 1. 数据结构设计 2. 功能实现 3. 主菜单设计 4. 文件操作 5. 系统使用 项目展示 1.主菜单功能界面 ​编辑 2.添加信息 3.查询信息 4.修改信息 5.删除信息 6.退出程序 项目完整代码 结语 在这篇博客中&#xff0c;我们将探讨如何使用C语言来开发…

Java 反射机制

​ 更多内容&#xff0c;前往IT-BLOG ​ 反射Reflection被视为动态语言的关键&#xff0c;反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息&#xff0c;并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构…

通过QScrollArea寻找最后一个弹簧并且设置弹簧大小

项目原因&#xff0c;最近需要通过QScrollArea寻找其中最后一个弹簧并且设置大小和策略&#xff0c;因为无法直接调用UI指针&#xff0c;所以只能用代码寻找。 直接上代码&#xff1a; if (m_scrollArea){int iScrollWidth m_labelSelectedTitle->width();m_scrollArea-&g…

C语言--- 指针(3)

一.字符指针变量 在指针的类型中&#xff0c;我们知道有一种指针类型为字符指针char * 一般使用&#xff1a; #include<stdio.h> int main() {char ch a;char* p &ch;*p b;printf("%c\n",ch);return 0; } 其实还有一种使用方式 &#xff1a; #inc…

【前端素材】推荐优质后台管理系统Salreo平台模板(附源码)

一、需求分析 当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;以便更好地理解其在不同方面的作用和实际运作。 1. 结构层次 在结构层次上&#xff0c;后台管理系统可以分为以下几个部分&#xff1a; a. 辅助功能模块&#…

2024年2月国内如何快速注册OnlyFans最新小白教学

前言 onlyface软件是一个创立于2016年的订阅式社交媒体平台&#xff0c;创作者可以在自己的账号发布原创的照片或视频&#xff0c;并将其设置成付费模式&#xff0c;若用户想查看则需要每月交费订阅。 需要注意的是&#xff0c;网络上可能存在非法或不道德的应用程序&#xff…

【C++】树形关联式容器set、multiset、map和multimap的介绍与使用

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.关联式容器 2.键…

鸿蒙应用成企业布局新方向 鸿蒙人才成开年之后“香饽饽”

随着春节假期的结束&#xff0c;职场人也开始返工返岗。与此同时2024年春招季也已拉开帷幕。2月23日&#xff0c;据智联招聘发布的《2024年春招市场行情周报》&#xff08;第一期&#xff09;显示&#xff0c;2024年春节后第一周&#xff0c;依托消费需求释放与制造业返工复产&…

【JavaEE】_前端POST请求借助form表单向后端传参

目录 1. 前端POST请求借助form表单向后端传参 2. 关于parameter方法获取参数的优先性问题 前端向后端传参通常有三种方法&#xff1a; 第一种&#xff1a;使用GET请求的query string部分向后端传参&#xff1a; 本专栏中已经详述了前端使用GET请求的query string向后端传参…

源聚达电商:抖音上的店铺评分是真的吗

在数字时代的浪潮中&#xff0c;抖音不仅是年轻人展示才华的舞台&#xff0c;也成为了商家营销的新阵地。然而&#xff0c;随着商业活动的增多&#xff0c;一个值得探讨的问题浮现出来&#xff1a;抖音上的店铺评分是否真实可靠? 抖音店铺的评分系统&#xff0c;理论上是对商家…