TCP/UDP 收发流程(网络字节序---函数讲解)

一、字节序核心原理

字节序是多字节数据在内存的存放顺序,仅影响 IP、端口整型数据,是 TCP/UDP 通信错乱的根本原因。

1. 主机字节序(小端)

电脑、开发板默认 小端序:低字节存低地址,字节颠倒存放。

例:端口 8080 = 0x1F90

内存存储:0x90 0x1F

本机 CPU 可正常识别,本地运行没问题,但不能直接发网络。

2. 网络字节序(大端)

TCP/IP 协议强制统一 大端序:高字节存低地址,字节正序存放。

网络标准字节:0x1F 0x90

核心矛盾

主机小端倒着存 ,网络大端正着传,不转换必然数值错乱。

不转换的错误后果

直接发送本机颠倒字节 0x90 0x1F

对方按大端解析:0x901F = 36911

原本 8080 端口,两端端口不匹配,直接连接失败。

3. TCP/UDP 标准收发流程(核心)

发送端:

本机小端颠倒字节 → htons/inet_aton 翻转1次(转正为网络大端) → 发送

接收端:

网络传来的是正序大端字节,小端 CPU 直接读会错乱;

++必须调用 ntohs 再翻转一次++,还原为本机正确数值。

终极一句话

发送翻一次转正、接收翻一次还原,两次翻转抵消大小端差异,通信数据才一致。


二、IP 转换函数(TCP/UDP 绑定/连接专用)

头文件

cs 复制代码
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h>

结构体

cs 复制代码
typedef uint32_t in_addr_t;
struct in_addr {
    in_addr_t s_addr; // 存放网络字节序IP
};

1. inet_aton

int inet_aton(const char *cp, struct in_addr *inp);

功能:点分字符串IP → 网络字节序二进制IP

场景:TCP/UDP 的 connect、bind 填 IP 地址专用。

特点:内部自动字节序翻转,无需 htonl

2. inet_ntoa

char *inet_ntoa(struct in_addr in);

功能:网络字节序IP → 可读字符串IP

场景:打印客户端IP、日志输出调试。

IP 示例代码

cs 复制代码
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <stdio.h> 

int main() {    
    struct in_addr in;    
    inet_aton("192.168.31.134",&in);    
    printf("IP:%s\n",inet_ntoa(in));    
    return 0; 
}

三、端口转换函数(TCP/UDP 核心必用)

记忆:h主机 n网络 s16位端口 l32位整型

1. htons

uint16_t htons(uint16_t hostshort);

主机16位端口 → 网络大端端口

场景:给 sockaddr_in.sin_port 赋值(必须用)

2. ntohs

uint16_t ntohs(uint16_t netshort);

网络端口 → 主机端口

场景:接收对端端口、打印真实端口号

3. htonl / ntohl

32位整型字节序翻转,普通 TCP/UDP 开发不用,仅用于自定义协议。


四、TCP/UDP 开发避坑精华(必记)

  • 端口只能用 htons / ntohs,不能用 32 位函数

  • inet_aton 自带网络字节序,禁止再套 htonl

  • 端口不写 htons = 百分百端口错乱、连不上

  • 发送转网络序,接收转主机序

相关推荐
知识分享小能手10 小时前
C++ 学习教程,从入门到精通,C++ 友元、异常和其他特性 — 详细知识点(15)
开发语言·c++·学习
朝朝辞暮i10 小时前
C++ 第 26 课:对象、指针与 ->
java·开发语言·c++
2601_9628857211 小时前
如何用 Python 做股价历史分位选股?(筛出处于历史低位的股票)
开发语言·python
殷色玫瑰11 小时前
C++入门基础复习:从命名空间到引用与nullptr,一篇重新捡回C++基础
java·开发语言·c++
(Charon)11 小时前
【C++面试】手写线程池:任务队列、工作线程与优雅退出
开发语言·c++
言乐611 小时前
Python概括后端原理
开发语言·python·django·virtualenv·pygame
@大迁世界12 小时前
JEV RAG:更高效的 RAG 系统解决方案?
开发语言·rust
朝朝辞暮i12 小时前
C++ 第一阶段总结:从零基础到 ROS2 前置语法
开发语言·c++·算法
2601_9628857213 小时前
如何用 Python 回测定投策略(定期定额 DCA)?(和一次性买入对比)
开发语言·人工智能·python
周杰偷奶茶13 小时前
【JavaSE】类和对象基础
java·开发语言