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 结构体
相关推荐
BingoGo1 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack1 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982072 天前
PHP 扩展——从入门到理解
php
鹏仔先生3 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下3 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip3 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
程序员mine3 天前
HTTPS-TLS加密与证书完全指南(中)
网络协议·https·ssl
之歆3 天前
现代 HTTP 客户端深度解析:Fetch 与 Axios
chrome·网络协议·http
酉鬼女又兒3 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2503 天前
不要再继续优化 TCP
网络协议·tcp/ip·php