docs: 全面校对全部章节文档与示例代码

通过多智能体工作流对 19 章笔记(README.md)与 96 个 .c 示例代码做深度
审查与对抗性验证,修复 317 处确认问题,涵盖:

技术正确性:
- 修复缓冲区溢出:echo_mpserv.c / echo_storeserv.c 等的 read(buf, BUFSIZ)
  改为 BUF_SIZE(buf 仅 30 字节,BUFSIZ 远大于此)
- 修复 open() 缺少 mode 参数:low_open.c / fd_seri.c / desto.c 等
  O_CREAT 调用补 0644(原导致 low_read 链路失败)
- 修复 feof 循环 off-by-one:news_sender.c / echo_stdserv.c 改用 fgets
  返回值判断
- 修复线程竞态:chat_server.c / webserv_linux.c 的 &clnt_sock 栈地址
  传子线程改为 malloc 分配 + free
- 修复索引混淆:char_EPLTserv.c 错用 clnt_sock 查找改为 ep_events[i].data.fd
- 修复格式化符:thread4.c 的 sizeof 用 %d 改为 %zu
- 修正习题答案:ch01 fd 序号、ch13 MSG_OOB 加粗项、ch09 Nagle 等

文档规范:
- 统一术语:IPv4/IPv6、接收(receive)/连接(connection)
- 修正错别字:occured→occurred、cooffee→coffee、Usgae→Usage、
  eerror→error、proess→process 等
- 修复病句、补全习题答案解释
- GitHub 绝对 URL 改为相对路径,统一项目引用规范
- 同步根 README.md(前言 + 19 章合并)

另:重命名 ch10/remove_zomebie.c → remove_zombie.c(修正拼写)

所有 .c 文件经 gcc 编译验证通过(ch17 epoll 文件因 macOS 无 sys/epoll.h
跳过,已人工复核)。
This commit is contained in:
riba2534
2026-06-28 12:47:46 +08:00
parent a9ef4b6dc4
commit 5625eea472
76 changed files with 707 additions and 629 deletions

View File

@@ -1,6 +1,6 @@
## 第二章 套接字类型与协议设置
本章代码,在[TCP-IP-NetworkNote](https://github.com/riba2534/TCP-IP-NetworkNote)中可以找到,直接点接可能进不去。
本章代码,在[TCP-IP-NetworkNote](https://github.com/riba2534/TCP-IP-NetworkNote)中可以找到,直接点接可能进不去。
本章仅需了解创建套接字时调用的 socket 函数。
@@ -34,7 +34,7 @@ protocol: 计算机间通信中使用的协议信息
| PF_PACKET | 底层套接字的协议族 |
| PF_IPX | IPX Novell 协议族 |
本书着重讲 PF_INET 对应的 IPv4 互联网协议族。其他协议并不常用,或并未普及。**另外,套接字中采用的最终的协议信息是通过 socket 函数的第三个参数传递的。在指定的协议族范围内通过第一个参数决定第三个参数。**
本书着重讲 PF_INET 对应的 IPv4 互联网协议族。其他协议并不常用,或并未普及。**另外,套接字中采用的最终的协议信息是通过 socket 函数的第三个参数传递的。在指定的协议族(第一个参数)和套接字类型(第二个参数)范围内,即可确定第三个参数(具体协议)。**
#### 2.1.3 套接字类型Type
@@ -52,9 +52,9 @@ protocol: 计算机间通信中使用的协议信息
这种情形适用于之前说过的 write 和 read 函数
> 传输数据的计算机通过调用3次 write 函数传递了 100 字节的数据,但是接数据的计算机仅仅通过调用 1 次 read 函数调用就接了全部 100 个字节。
> 传输数据的计算机通过调用3次 write 函数传递了 100 字节的数据,但是接数据的计算机仅仅通过调用 1 次 read 函数调用就接了全部 100 个字节。
收发数据的套接字内部有缓冲buffer简言之就是字节数组。只要不超过数组容量那么数据填满缓冲后过 1 次 read 函数的调用就可以读取全部,也有可能调用多次来完成读取。
收发数据的套接字内部有缓冲buffer简言之就是字节数组。只要不超过数组容量那么数据填满缓冲后过 1 次 read 函数的调用就可以读取全部,也有可能调用多次来完成读取。
**套接字缓冲已满是否意味着数据丢失?**
@@ -62,7 +62,7 @@ protocol: 计算机间通信中使用的协议信息
套接字联机必须一一对应。面向连接的套接字可总结为:
**可靠、按序传递的、基于字节的面向连接的数据传输方式的套接字。**
**可靠、按序传递的、基于字节的面向连接的数据传输方式的套接字。**
#### 2.1.5 面向消息的套接字SOCK_DGRAM
@@ -73,13 +73,13 @@ protocol: 计算机间通信中使用的协议信息
- 传输的数据有边界
- 限制每次传输数据的大小
面向消息的套接字比面向连接的套接字更具有传输速度,但可能丢失。特点可总结为:
面向消息的套接字比面向连接的套接字传输速度更快,但数据可能丢失。特点可总结为:
**不可靠的、不按序传递的、以数据的高速传输为目的套接字。**
**不可靠的、不按序传递的、以数据的高速传输为目的套接字。**
#### 2.1.6 协议的最终选择
socket 函数的第三个参数决定最终采用的协议。前面已经通过前两个参数传递了协议族信息和套接字数据传输方式,这些信息还不够吗?为什么要传第三个参数呢?
socket 函数的第三个参数决定最终采用的协议。前面已经通过前两个参数传递了协议族信息和套接字数据传输方式,这些信息还不够吗?为什么要传第三个参数呢?
> 可以应对同一协议族中存在的多个数据传输方式相同的协议,所以数据传输方式相同,但是协议不同,需要用第三个参数指定具体的协议信息。
@@ -99,8 +99,8 @@ int udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
需要对第一章的代码做出修改,修改好的代码如下:
- [tcp_client.c](https://github.com/riba2534/TCP-IP-NetworkNote/blob/master/ch02/tcp_client.c)
- [tcp_server.c](https://github.com/riba2534/TCP-IP-NetworkNote/blob/master/ch02/tcp_server.c)
- [tcp_client.c](tcp_client.c)
- [tcp_server.c](tcp_server.c)
编译:
@@ -231,7 +231,7 @@ gcc tcp_server_win.c -o hserver -lws2_32
> ①传输过程中数据不会消失②按序传输数据③传输的数据不存在数据边界Boundary
3. 下面些是面向消息的套接字的特性?
3. 下面些是面向消息的套接字的特性?
- **传输数据可能丢失**
- 没有数据边界Boundary