从协议回顾到第一个并发服务端

这部分内容解决的是“会敲 socket 套接字几个函数名,但不懂为什么这么调”的脱节问题。很多人写网络程序,照着模板填 socket、bind、listen、accept 四步走,一旦客户端连不上、端口起不来或者读写错乱,就只能瞎猜。这一章把网络编程拆成两段:前半截从协议族、跨网通信、TCP特性往回倒,补足底层认知;后半截逐个拆解 socket 域参数、类型参数、bind 的地址结构体、listen 的队列、accept 的握手返回值。如果你之前只背过调用顺序,没搞清过 sockaddr_in 里的成员怎么填,这部分正好补齐。建议先看协议回顾那几块,确认自己能说清跨网通信时数据包怎么走、TCP 怎样保证可靠,再往下钻具体的系统调用。

参数填错和字节序踩坑怎么治

网络编程的坑不在函数名难记,而在参数填法和本地与网络之间的差异。bind 报错“地址已被占用”或者客户端死活连不上,根子往往在地址结构体没初始化干净、sin_family 和 sin_port 没对上。课程里专门拎出 htons 和端口号、inet_addr 这两块,讲的就是主机字节序和网络字节序的转换,以及点分十进制地址怎么塞进结构体。很多人写完服务端,发现只能接受本机回环连接,外部机器死活连不进,就是没搞懂 INADDR_ANY 到底代表什么、inet_addr 返回的字节序是什么。这部分适合那些能写出最简 echo 服务、但一遇到多客户端就乱套的人。配套练习时,别只跑通本地环回,强制用两台机器或者虚拟机双网卡对连,故意把端口和地址填错,观察 bind 和 accept 的报错时机。

学完能独立做什么、资料怎么配

啃完这章,你应该能独立从零手写一个单线程的 TCP 服务端和配套客户端,并且能说清每一步系统调用的参数含义和返回值怎么处理。具体来说,给定一个端口和监听地址,你能正确初始化 sockaddr_in、用 bind 绑定、用 listen 挂起队列、用 accept 拿到已连接套接字,再配合 send 和 recv 收发数据。资料配合练习时,建议看完每个函数的讲解,立刻写一个最小验证用例:看完 bind 就写一段只绑定端口不监听的代码,用 netstat 或者 ss 命令去查端口状态;看完 accept 就写一个只能接一个连接的阻塞服务端,用 telnet 或者自己写的客户端去连。别急着抄完整的框架代码,先把单函数的行为摸透,再往下拼接。重点验证两个问题:bind 到零地址和到具体地址有什么区别?listen 的队列长度在并发连接时怎么影响 accept 的返回?把这两个问题在本地跑出答案,这章的基础就算扎了。

课程目录

1 网络编程概述 (21:09)
2 回顾TCP、IP协议族 (20:46)
3 回顾局域网通信 (11:51)
4 回顾跨网通信1 (27:07)
5 回顾跨网通信 2 (14:31)
6 TCP协议的特点 1 (23:06)
7 TCP协议的特点 2 (11:07)
8 TCP编程模型 (21:09)
9 socket函数 之 domian参数 1 (18:01)
10 socket函数 之 domian参数 2 (08:14)
11 socket函数 之 type和protocol参数 (23:26)
12 bind函数1 (26:54)
13 bind函数2 (09:07)
14 htons函数 与 端口号 (25:34)
15 inet_addr函数 (15:34)
16 listen函数 (14:51)
17 accept函数 (26:31)
18 send发送数据 (21:36)
19 recv函数 (17:39)
20 调用close或者shutdown 断开连接 (16:17)
21 TCP客户端程序的实现 1 (21:10)
22 TCP客户端程序实现 2 (20:36)
23 TCP通信的具体过程 (27:08)
24 UDP通信 1 (11:00)
25 UDP通信 2 (24:20)
26 UDP通信 3 (24:42)
27 UDP通信4 (16:59)
28 UDP通信 5 (13:03)
29 域套接字 1 (32:21)
30 域套接字 2 (34:16)
31 广播 组播 (10:43)
32 多线程实现多客户 (35:07)
33 多进程实现 多客户 (31:29)
34 多路io实现 多客户 (14:39)