《TCP/IP网络编程》第 10 章 多进程服务器端 笔记( 七 )


文章插图
如图所示,1 个套接字存在 2 个文件描述符时,只有 2 个文件描述符都终止(销毁)后,才能销毁套接字 。如果维持图中的状态,即使子进程销毁了与客户端连接的套接字文件描述符,也无法销毁套接字(服务器套接字同样如此) 。因此调用 fork 函数候,要将无关紧要的套接字文件描述符关掉,如图所示:

《TCP/IP网络编程》第 10 章 多进程服务器端 笔记

文章插图
10.5 分割 TCP 的 I/O 程序 10.5.1 分割 I/O 的优点
我们已经实现的回声客户端的数据回声方式如下:
向服务器传输数据,并等待服务器端回复 。无条件等待,直到接收完服务器端的回声数据后,才能传输下一批数据 。
传输数据后要等待服务器端返回的数据,因为程序代码中重复调用了 read 和 write 函数 。只能这么写的原因之一是,程序在 1 个进程中运行,现在可以创建多个进程,因此可以分割数据收发过程 。默认分割过程如下图所示:
《TCP/IP网络编程》第 10 章 多进程服务器端 笔记

文章插图
从图中可以看出,客户端的父进程负责接收数据,额外创建的子进程负责发送数据,分割后,不同进程分别负责输入输出,这样,无论客户端是否从服务器端接收完数据都可以进程传输 。
分割 I/O 程序的另外一个好处是,可以提高频繁交换数据的程序性能,图下图所示:
《TCP/IP网络编程》第 10 章 多进程服务器端 笔记

文章插图
根据上图显示可以看出,再网络不好的情况下,明显提升速度 。
10.5.2 回声客户端的 I/O 程序分割
下面是回声客户端的 I/O 分割的代码实现:
可以配合刚才的并发服务器进行执行 。
编译运行:
gcc echo_mpclient.c -o eclient./eclient 127.0.0.1 9190
结果:
《TCP/IP网络编程》第 10 章 多进程服务器端 笔记

文章插图
可以看出,基本和以前的一样,但是里面的内部结构却发生了很大的变化
10.6 习题