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 = 百分百端口错乱、连不上

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

相关推荐
Funlang10 小时前
龙芯上的 Fun:从跑起来到机器码
开发语言·龙芯
总要学点什么11 小时前
第104篇:三维特效-流动墙体效果——让贴图沿墙流动,它却只肯走一条对角线
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
笑容掩饰我的失落11 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
旖旎夜光11 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu11 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
普通人612 小时前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
꧁细听勿语情꧂12 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
SomeOtherTime12 小时前
Rust集合(AI回答)
开发语言·后端·rust
曦樂~12 小时前
【Web Development】03JavaScript 基础和事件
开发语言·前端·javascript
郝学胜-神的一滴13 小时前
LangChain Skill 实现(渐进披露 On-Demand Skill,LangChain 官方 Deep Agent Skill 模式)
开发语言·python·langchain·numpy