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 结构体
相关推荐
鲜花飘飘扬3 小时前
HTTP请求头中表示代理IP地址的属性及获取情况
网络协议·tcp/ip·http
狗凯之家源码网5 小时前
短剧系统搭建实战:源码功能与商业变现效果全景展示
开发语言·php
连续讨伐7 小时前
php小结
开发语言·php
paopaokaka_luck7 小时前
基于springboot3+vue3的智能文库平台(AI智能搜索、AI智能汇总、实时在线状态展示、多格式文档预览与富文本编辑、Echarts图形化分析)
前端·网络·spring boot·网络协议·echarts
2601_965798477 小时前
MTDb Movie & TV Database Script Setup, Caching, and SEO Guide
linux·服务器·数据库·php
发光小北8 小时前
SG-RS232/485/422-Fiber-110 串口光纤收发器如何使用?
网络协议
小小代码狗10 小时前
PHP 常用函数与变量参考文档
开发语言·安全·php
看昭奚恤哭10 小时前
LWIP TCP滑动窗口为TCP ZeroWindow的解决方法
网络·tcp/ip·php
AC赳赳老秦10 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
M1582276905510 小时前
工业跨网段通信零改造方案!SG-NAT-210/410 NAT 网关全功能解析,不改 PLC IP 实现多协议互通
网络·网络协议·tcp/ip