sockets - 套接字写入小端
问题描述
我有以下 4 字节对齐的结构数据(根本没有填充),这些数据在通过 TCP 套接字发送之前被复制到 unsigned char * 缓冲区。发送方机器是 Little Endian 系统,接收方机器是 Big Endian 系统。
typedef struct {
unsigned short a;
unsigned short b;
} Struct;
Struct s;
s.a = 1;
s.b = 2;
...
memmcpy (buf, (unsigned char *)&s, sizeof (Struct));
write (sockfd, buf, sizeof(Struct));
在发送方系统上,我想象 sa 在内存中表示为 01 00 和 sb 02 00,因此发出的流是 01 00 02 00。我假设在这种情况下发送方正在发送 little endian 字节顺序网络而不是网络字节顺序。
由于接收器是大端系统,我的问题是:
- 发送方应按网络字节顺序发送(必须在 sa 和 sb 上调用 htons)
- 或者接收者应该通过调用 ntohs 来处理这个问题?
解决方案
这个问题没有单一的答案,两者都有先例:
大多数 Internet 协议使用网络字节顺序,这意味着每一端都有一个代码路径,但当两台 little-endian 机器通信时可能需要不必要的字节交换。
CORBA IIOP 以主机字节顺序发送,以及一个指示哪个顺序的标志 - 如果标志与它们自己的本地顺序不同,客户端必须能够交换字节顺序。
在您的情况下,鉴于您知道主机具有不同的字节序,我建议您指定您的协议以使用网络字节顺序 - 这样您会让更少的人感到惊讶。
推荐阅读
- kubernetes - Prometheus Adapter 自定义指标 HPA
- c# - 强制玩家在一定时间之前 GetKeyUp
- php - 在 WP (php) 中修剪文本
- .htaccess - 从强制 https:// 中免除多个站点文件夹
- python - 使用 SignatureDefs 将 API 端点映射到特定方法的 TensorFlow Serving 模型保存?
- ios - 侧边菜单在视图
- java - 不正确的字符串值:'\xF0\x9F\xA4\x96
我已将列类型设置为 utf8mb4,将排序规则设置为 utf8mb4_bin。表默认值也是 utf8mb4 和 utf8mb4_bin。
当我使用 SequelPro 手动将表情符号“”添加到数据库时,它工作得很好。
但是,当我使用 JDBC 执行 INSERT 时,它给了
- botframework - Bot Framework v4 - Bot 发起对话
- docker - 判断我们是否在 docker 内部的命令
- string - 嗨,我想知道如何在 python 3.7 中的二进制字符串之间插入二进制数据?