UDP 服务端 + 客户端 全场景字节序 & 类型转换

一、为什么必须做类型 / 字节序转换?

  1. 人类用的是:IP字符串 (如 192.168.1.1
  2. 网络传输用的是:uint32_t 整数
  3. 本机用的是:主机字节序(小端)
  4. 网络协议用的是:网络字节序(大端)

所以:数据进网络之前必须转,出网络之后必须转回来。


二、核心转换函数

函数 英文全名 中文含义 作用
htons Host TO Network Short 主机 -> 网络(短整型 16 位) 端口号发送前转换
ntohs Network TO Host Short 网络 -> 主机(短整型 16 位) 端口号接收后解析
htonl Host TO Network Long 主机 -> 网络(长整型 32 位) IP 整数发送前转换
ntohl Network TO Host Long 网络 -> 主机(长整型 32 位) IP 整数接收后解析

三、UDP转换总结

1. 端口号转换(16 位整数)

主机发给网络 → 用 htons (Host TO Network Short) 主机端口 → 网络字节序( 短整型 16 位**)**

cpp 复制代码
//服务端中,绑定bind服务端进程的端口号
local.sin_port = htons(port_);

//客户端中,把目标服务器端口serverport放入struct sockaddr_in server中;
server.sin_port = htons(serverport);

网络发给主机 → 用 ntohs(Network TO Host Short) 网络**字节序** -> 主机**端口**(短整型 16 位)

cpp 复制代码
//服务器获得客户端的端口号
uint16_t clientport = ntohs(client.sin_port);

2. IP 地址转换(string ↔ uint32_t)

网络序整数 IP 转回字符串 IP , 用 inet_ntoa( Network TO Address**) **

cpp 复制代码
//服务端接收(recvfrom)客户端client中获得客户端ip
std::string clientip = inet_ntoa(client.sin_addr);

字符串 IP 转变类型为网络序整数 IP , 用 inet_addr( Address**) **

cpp 复制代码
//服务端中,绑定(bind)服务端ip
server.sin_addr.s_addr = inet_addr(serverip.c_str());

3. 服务端 INADDR_ANY (INADDR_ANY = 0.0.0.0)主机字节序 特殊转换
用 htonl (Host TO Network Long) 转成网络字节序
cpp 复制代码
//服务端中,绑定(bind)任意服务端ip
local.sin_addr.s_addr = htonl(INADDR_ANY);

四、完整转换对应表

功能 函数 英文全名 代码位置
主机端口 → 网络端口 htons Host To Network Short 客户端、服务端 bind
网络端口 → 主机端口 ntohs Network To Host Short 服务端解析客户端
字符串 IP → 网络整数 IP inet_addr Internet Address 客户端填充 server
网络整数 IP → 字符串 IP inet_ntoa Internet Network To Address 服务端打印客户端 IP
0.0.0.0 转网络序 htonl Host To Network Long 服务端 bind
结构体类型强转 (struct sockaddr*)&... - bind / recvfrom / sendto

六、总结

  1. 端口一定用 htons / ntohs
  2. IP 字符串一定用 inet_addr / inet_ntoa
  3. INADDR_ANY 必须 htonl
  4. 所有系统调用必须强转 sockaddr 结构体
相关推荐
sdghterhd4 小时前
WebSocket 快速入门教程(附示例源码)
网络·websocket·网络协议
weixin_BYSJ19876 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
IpdataCloud10 小时前
AI生成的Avalon恶意框架怎么防?用IP离线库识别模块化C2通信
运维·人工智能·网络协议·tcp/ip·ip
用户30745969820712 小时前
GatewayWorker 从零到一完整指南
javascript·php
一口一口吃成大V12 小时前
lattice mipi ip开启DESKEW_EN属性(“ENABLED“),输出异常
网络·网络协议·tcp/ip
XR12345678814 小时前
食品饮料与制药行业GMP合规网络建设:无尘车间的网络不能成为污染源
开发语言·网络·php
AC赳赳老秦16 小时前
传感器数据自动汇总:OpenClaw 采集多类传感器数据、清洗入库、生成趋势分析
java·人工智能·python·自动化·github·php·openclaw
Dynadot_tech16 小时前
如何拍卖域名
开发语言·php
奇牙coding12316 小时前
OpenAI Realtime API WebSocket 断连 4008/1006 怎么解决?不是 Key 失效,是实时多模态独有的会话超时规则
python·websocket·网络协议·ai
Helen_cai17 小时前
OpenHarmony http 网络请求封装与全局拦截实战(API Version23 + 适配版)
网络·网络协议·http·华为·harmonyos