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

Linux操作系统中的SOCKET相关 - Socket字节序调整与网络传输

在网络编程中,Socket通信涉及字节序调整(Endianness Conversion)的主要场景是处理多字节数据(如 int, short, float, double 等)的传输。因为不同主机可能使用不同的字节序(大端序 Big-Endian 或小端序 Little-Endian),而网络协议标准规定使用**大端序(Network Byte Order)**作为统一格式。


需要手动调整字节序的情况

  1. 整数类型(uint16_t, uint32_t 等)
    使用以下函数转换:

    • htons():Host to Network Short(16位,如端口号)
    • htonl():Host to Network Long(32位,如IPv4地址)
    • ntohs():Network to Host Short
    • ntohl():Network to Host Long
    uint16_t port = 8080;
    uint16_t network_port = htons(port); // 主机序转网络序
    
  2. IP地址(IPv4 和 IPv6)

    • IPv4 地址通常用 inet_addr()inet_pton() 直接转换为网络字节序。
    • 手动处理时需调用 htonl()
      uint32_t ip = htonl(0x7F000001); // 127.0.0.1
      
  3. 自定义协议结构体
    如果结构体中包含多字节字段(如协议头),需逐字段转换:

    struct MyHeader {uint16_t type;    // 需htons()uint32_t length;  // 需htonl()
    };
    

不需要调整字节序的情况

  1. 单字节数据(char, uint8_t
    字节序不影响单字节数据。

  2. 字符串(如JSON、XML)
    文本协议本身是字节流,无需处理字节序。

  3. 已由库函数处理的数据

    • send()/recv() 直接传输的缓冲区(如字符串)。
    • 使用 inet_pton()/inet_ntop() 处理的IP地址。

注意事项

  • 浮点数:没有标准网络字节序函数,需转换为整数或字符串传输。
  • 现代协议:如HTTP、WebSocket等高层协议通常无需关心字节序(底层已处理)。
  • 调试工具:Wireshark等抓包工具显示的数据是网络字节序。

示例代码(IPv4 + 端口)

#include <arpa/inet.h>
#include <netinet/in.h>int main() {uint16_t port = 12345;uint32_t ip = inet_addr("192.168.1.1"); // 自动转网络序struct sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(port);      // 端口转网络序addr.sin_addr.s_addr = ip;        // IP已是网络序// 发送/接收数据时无需再转换return 0;
}

总结:凡是多字节数值且在网络传输中需要被解析的,都必须转换为网络字节序

http://www.xdnf.cn/news/5994.html

相关文章:

  • Kubernetes 标签和注解
  • 【软件测试】第一章·软件测试概述
  • 行动算子(知识)
  • GZip+Base64压缩字符串在ios上解压报错问题解决(安卓、PC模拟器正常)
  • 服务器中存储空间不足该怎么办?
  • IP协议的特性
  • 大白话解释联邦学习
  • skolelinux系统详解
  • Proxmox VE 8.4.0显卡直通完整指南:NVIDIA Tesla T4 实战
  • 什么是懒加载?
  • 06_java常见集合类底层实现
  • unity 制作某个旋转动画
  • 分割一切(SAM) 论文阅读:Segment Anything
  • 用vue和go实现登录加密
  • 科研领域开源情报应用:从全球信息网络到创新决策
  • 微机原理|| 流水灯实验
  • 两种常见的C语言实现64位无符号整数乘以64位无符号整数的实现方法
  • 【嵌入式】记一次解决VScode+PlatformIO安装卡死的经历
  • Apifox使用方法
  • Xianyu AutoAgent,AI闲鱼客服机器人
  • 无人机信号监测系统技术解析
  • codeforcesE. Anna and the Valentine‘s Day Gift
  • 在 STM32 上使用 register 关键字
  • 部署大模型:解决ollama.service: Failed with result ‘exit-code‘的问题
  • ROS多机集群组网通信(四)——Ubuntu 20.04图形化配置 Ad-Hoc组网通信指南
  • element-plus自动导入插件
  • 使用DevEco Studio性能分析工具高效解决鸿蒙原生应用内存问题
  • python的命令库Envoy
  • 【树莓派4B】对树莓派4B进行换源
  • 关于索引的使用