sockets - 为什么不需要使用 hton/ntoh 函数来发送 const char*?
问题描述
我正在使用套接字通过网络发送数据缓冲区。我看到转换字节序的唯一地方是发送方/接收方的端口号。我可以理解。
我无法理解的是我正在发送一个const char*
(使用send()
/ sendto()
,取决于传输协议)。据我了解,您在 Big Endian 中通过网络传输字节。我的机器是Little Endian。
ntoh()
发送时不使用/hton()
函数的诀窍是const char*
什么?
解决方案
背景:big-endian 与 little-endian 的概念仅适用于多字节整数(和浮点值);由于历史原因,不同的 CPU 可能通过不同的字节顺序在内存中表示相同的数字二进制值,因此伯克利套接字 API 的设计者创建ntoh*()
并将hton*()
CPU 的本机字节顺序(无论可能是什么)转换为“网络标准”格式(他们选择了大端)并返回,以便二进制数可以从一种机器类型传输到另一种机器类型,而不会被接收方的 CPU 误解。
至关重要的是,这种表示的分裂只发生在字节级别之上。即一个 N 字节字内的字节顺序在不同的 CPU 上可能不同,但每个字节内的位顺序总是相同的。
字符串(如 aconst char *
所指)是指一系列单独的 8 位字节,所有 CPU 类型都以相同的方式解释字节的顺序,因此无需转换其格式以保持数据兼容性跨 CPU。(请注意,有不同的格式可用于表示字符串,例如 ASCII 与 UTF-8 与 UTF-16 与等,但这是由软件做出的决定,而不是软件运行的 CPU 硬件的特性on;因此,Berkeley 套接字 API 不会尝试解决该问题)
推荐阅读
- git - 有没有办法运行 `git cherry-pick` 并指定特定于给定分支的一系列提交?
- javascript - 如何使用响应式搜索来实现“加载更多”功能?
- c# - NSubstitute 与 DbConnection
- javascript - 如何使“全局”组件基于 url 路由呈现内容?
- firebase - Firebase 云消息显示加载定位选项时出错
- javascript - 如何使用 d3 创建可重用的 Vue 组件?
- unity3d - 在 unity3D 中创建移动文本
- javascript - 如何在反应中的页面之间传递链接ID?
- javascript - 如何获取单个元素的 CSS 选择器/Xpath
- flutter - 如何在 Flutter 中动态生成多个 Dropdown?