各类资料学习下载合集
链接:https://pan.quark.cn/s/7c8c391011eb
一、 为什么需要“翻译官”?(字节序转换)
计算机存储数据有两种方式:
- 小端序 (Little Endian):低位在前(大部分 PC、Linux 主机默认)。
- 大端序 (Big Endian):高位在前(网络传输标准)。
如果你的主机是小端序,直接把端口号80发给网络,网络设备可能会把它读成20480!因此,我们需要一组函数来进行“翻译”。
助记口诀
函数名中的字母代表含义:
- h: host(主机字节序)
- n: net(网络字节序)
- s: short(16位,用于端口号)
- l: long(32位,用于 IPv4 地址)
常用函数
htons(8888): Host to Network Short ->把端口号转为大端(最常用)。ntohs(port): Network to Host Short ->把收到的端口号转回本机格式。htonl(ip): Host to Network Long ->把 IP 整数转为大端。ntohl(ip): Network to Host Long ->把收到的 IP 整数转回本机格式。
二、 IP 地址的“变身”:字符串 vs 整数
人类习惯看字符串形式的 IP(如"192.168.1.1"),但计算机网络层只认 32 位的整数(大端序)。我们需要两个核心函数来转换。
1.inet_pton(P -> N)
- 含义:Presentation (字符串) to Numeric (数值)。
- 作用:将
"192.168.1.1"转为大端整数,存入struct in_addr。 - 原型:
int inet_pton(int af, const char *src, void *dst);
2.inet_ntop(N -> P)
- 含义:Numeric (数值) to Presentation (字符串)。
- 作用:将网络发来的大端整数 IP 转回
"192.168.1.1"方便打印。 - 原型:
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
三、 核心结构体:sockaddr_in
在 Socket 编程中,最重要的结构体莫过于 IPv4 的地址结构struct sockaddr_in。
structsockaddr_in{sa_family_tsin_family;// 地址族协议,必须写 AF_INETin_port_tsin_port;// 端口号 (必须用 htons 转为网络字节序)structin_addrsin_addr;// IP地址 (必须是网络字节序的大端整数)};注意:在调用
bind