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

浅谈 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.lryc.cn/news/307342.html

相关文章:

  • Nginx网络服务六-----IP透传、调度算法和负载均衡
  • 【Linux进程】进程状态---进程僵尸与孤儿
  • MySQL数据库基础知识总结(适合小白入门使用)一
  • 历史新知网:寄快递寄个电脑显示器要多少钱?
  • 在两台CentOS 7服务器上部署MinIO集群。
  • 【计算机网络】深度学习使用应用层的HTTP协议
  • Ubuntu18.04 系统上配置并运行SuperGluePretrainedNetwork(仅使用CPU)
  • 协议-http协议-基础概念01-发展历程-http组成-http是什么-相关的应用-相关的协议
  • UI学习-学习内容
  • Flink CDC 提取记录变更时间作为事件时间和 Hudi 表的 precombine.field 以及1970-01-01 取值问题
  • 【网络安全】网络安全意识教育实用指南
  • wordpress模板购买网站推荐
  • LeetCode 刷题 [C++] 第240题.搜索二维矩阵 II
  • HP笔记本电脑如何恢复出厂设置?这里提供几种方法
  • Elasticsearch:了解人工智能搜索算法
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • 分享便携式血氧仪单片机方案
  • 【Java设计模式】四、适配器模式
  • RV32/64 特权架构 - 特权模式与指令
  • 多微服务合并为一个服务
  • Springboot企业级开发--开发入门01
  • bash和sh和./的区别
  • LeetCode 3:寻找最长不含重复字符的子串长度
  • 【自然语言处理四-从矩阵操作角度看 自注意self attention】
  • Unity脚本,串行端口的握手协议(流控制)
  • 2023 re:Invent 用 Amazon Q 打造你的知识库
  • ChatGPT 国内快速上手指南
  • Docker 常用操作命令备忘
  • BUU [CISCN2019 华东南赛区]Web4
  • 【卷积神经网络中用1*1 卷积有什么作用或者好处呢?】