mirror of
https://github.com/riba2534/TCP-IP-NetworkNote.git
synced 2026-05-05 06:03:10 +08:00
chore: 将所有外部图片本地化到仓库
- 下载 110 张外部图片到根目录 images/ 文件夹 - 更新所有 README.md 中的图片引用为统一路径 images/xxx.png - 55 张图片成功下载(PNG 格式) - 55 张失效图片创建占位文件(SVG/PNG) - 移除所有外部图片链接依赖 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -22,11 +22,11 @@ I/O 复用技术可以解决这个问题。
|
||||
|
||||
上述两种方法的内容完全一致。可以用纸电话模型做一个类比:
|
||||
|
||||

|
||||

|
||||
|
||||
上图是一个纸杯电话系统,为了使得三人同时通话,说话时要同时对着两个纸杯,接听时也需要耳朵同时对准两个纸杯。为了完成 3 人通话,可以进行如下图的改进:
|
||||
|
||||

|
||||

|
||||
|
||||
如图做出改进,就是引入了复用技术。
|
||||
|
||||
@@ -45,11 +45,11 @@ I/O 复用技术可以解决这个问题。
|
||||
|
||||
纸杯电话系统引入复用技术之后可以减少纸杯数量和连线长度。服务器端引入复用技术可以减少所需进程数。下图是多进程服务端的模型:
|
||||
|
||||

|
||||

|
||||
|
||||
下图是引入复用技术之后的模型:
|
||||
|
||||

|
||||

|
||||
|
||||
从图上可以看出,引入复用技术之后,可以减少进程数。重要的是,无论连接多少客户端,提供服务的进程只有一个。
|
||||
|
||||
@@ -69,7 +69,7 @@ select 函数是最具代表性的实现复用服务器的方法。在 Windows
|
||||
|
||||
select 函数的使用方法与一般函数的区别并不大,更准确的说,他很难使用。但是为了实现 I/O 复用服务器端,我们应该掌握 select 函数,并运用于套接字编程当中。认为「select 函数是 I/O 复用的全部内容」也并不为过。select 函数的调用过程如下图所示:
|
||||
|
||||

|
||||

|
||||
|
||||
#### 12.2.2 设置文件描述符
|
||||
|
||||
@@ -77,7 +77,7 @@ select 函数的使用方法与一般函数的区别并不大,更准确的说
|
||||
|
||||
利用 fd_set 数组变量执行此操作,如图所示,该数组是存有0和1的位数组。
|
||||
|
||||

|
||||

|
||||
|
||||
图中最左端的位表示文件描述符 0(所在位置)。如果该位设置为 1,则表示该文件描述符是监视对象。那么图中哪些文件描述符是监视对象呢?很明显,是描述符 1 和 3。在 fd_set 变量中注册或更改值的操作都由下列宏完成。
|
||||
|
||||
@@ -88,7 +88,7 @@ select 函数的使用方法与一般函数的区别并不大,更准确的说
|
||||
|
||||
上述函数中,FD_ISSET 用于验证 select 函数的调用结果,通过下图解释这些函数的功能:
|
||||
|
||||

|
||||

|
||||
|
||||
#### 12.2.3 设置检查(监视)范围及超时
|
||||
|
||||
@@ -134,7 +134,7 @@ struct timeval
|
||||
|
||||
select 返回正整数时,怎样获知哪些文件描述符发生了变化?向 select 函数的第二到第四个参数传递的 fd_set 变量中将产生如图所示的变化:
|
||||
|
||||

|
||||

|
||||
|
||||
由图可知,select 函数调用完成后,向其传递的 fd_set 变量将发生变化。原来为 1 的所有位将变成 0,但是发生了变化的文件描述符除外。因此,可以认为值仍为 1 的位置上的文件描述符发生了变化。
|
||||
|
||||
@@ -153,7 +153,7 @@ gcc select.c -o select
|
||||
|
||||
结果:
|
||||
|
||||

|
||||

|
||||
|
||||
可以看出,如果运行后在标准输入流输入数据,就会在标准输出流输出数据,但是如果 5 秒没有输入数据,就提示超时。
|
||||
|
||||
@@ -172,7 +172,7 @@ gcc echo_selectserv.c -o selserv
|
||||
|
||||
结果:
|
||||
|
||||

|
||||

|
||||
|
||||
从图上可以看出,虽然只用了一个进程,但是却实现了可以和多个客户端进行通信,这都是利用了 select 的特点。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user