什么是网络字节序?为何同机Socket连接PostgreSQL需使用它?
网络字节序是什么?为什么此处必须使用?
一、网络字节序的定义
网络字节序就是大端字节序(Big-endian),是网络通信中统一规定的多字节数据存储/传输规则:
- 对32位整数这类多字节数据,高位字节存在内存低地址,低位字节存在内存高地址。
- 而不同CPU的主机字节序可能不一样,比如常见的x86架构是小端字节序,部分PowerPC架构是大端字节序。
二、为什么这个libpq场景必须用网络字节序
1. PostgreSQL二进制协议的硬性规定
PostgreSQL的二进制通信协议明确要求,所有跨Socket传输的多字节数据(比如整数类型)必须使用大端字节序。
2. 直接用主机字节序会导致解析错误
你的主机是x86架构(小端字节序),直接赋值(uint32_t)2时,内存里存储的字节是0x02 0x00 0x00 0x00。但PostgreSQL服务器会按协议要求的大端字节序解析这段数据,把它识别成完全错误的数值,甚至直接判定为无效值(也就是你看到的查询条件变成i = NULL的原因)。
而htonl()函数的作用就是把主机字节序的数值转换成网络字节序:把2转换成大端格式的0x00 0x00 0x00 0x02,服务器解析后得到正确的数值2,自然能匹配到预期的元组。
3. 同一机器也需要遵守规则
哪怕服务器和客户端在同一台机器,只要用Socket通信(PostgreSQL底层依赖Socket),就必须遵循网络字节序的协议规范——协议本身的设计不依赖主机位置,只看通信标准。
内容的提问来源于stack exchange,提问作者jian
相关产品推荐
相关产品推荐

