各类资料学习下载合集
链接:https://pan.quark.cn/s/770d9387db5f
一、 套接字(Socket):网络的插头与插座
Socket 的原意是“插座”。在网络通信中,它的角色分工非常明确,就像家用电器插电一样:
- 服务器端 (Server):扮演插座的角色。它被动等待,必须绑定一个固定的 IP 和端口,静静等待别人来连。
- 客户端 (Client):扮演插头的角色。它主动发起连接,必须知道服务器的 IP 和端口才能“插”进去。
虽然编程语言各异(C, Python, Java),但这套基于 TCP/IP 的流程是全球通用的事实标准。
二、 隐形杀手:字节序 (Byte Order)
你可能会问:“由于不同计算机的体系结构不同,内存存储数据的方式也不同,这会影响通信吗?”答案是肯定的。
1. 什么是大端与小端?
假设我们要存储一个十六进制数字0x12345678(共4个字节)。
- 大端序 (Big-Endian):高位字节存放在低地址。
- 内存样子:
12 34 56 78(符合人类阅读习惯) - 网络字节序采用这种标准。
- 内存样子:
- 小端序 (Little-Endian):低位字节存放在低地址。
- 内存样子:
78 56 34 12(x86 架构电脑常用) - 主机字节序通常是这种。
- 内存样子:
2. 为什么要转换?
如果你的电脑(小端)发给服务器(大端)一个端口号80,如果不转换,服务器读出来的可能就是20480!因此,Socket 编程规定:所有大于 1 个字节的数据(如 int, short),传输前必须转换为网络字节序(大端)。
三、 代码实战 1:检测你的电脑是“大端”还是“小端”
在开始写 Socket 代码前,我们先写一段 C 代码,看看你当前使用的电脑内存里到底是怎么存数据的。
代码 (check_endian.c)
#include<stdio.h>intmain(){// 定义一个 4 字节的整数unsignedintx=0x12345678;// 使用字符指针指向 x 的首地址 (只看第 1 个字节)unsignedchar*c=(unsignedchar*)&x;printf("原始数值: 0x12345678\n");printf("内存首字节内容: 0x%x\n",*c);if