文章插图
如图所示,1 个套接字存在 2 个文件描述符时,只有 2 个文件描述符都终止(销毁)后,才能销毁套接字 。如果维持图中的状态,即使子进程销毁了与客户端连接的套接字文件描述符,也无法销毁套接字(服务器套接字同样如此) 。因此调用 fork 函数候,要将无关紧要的套接字文件描述符关掉,如图所示:
文章插图
10.5 分割 TCP 的 I/O 程序 10.5.1 分割 I/O 的优点
我们已经实现的回声客户端的数据回声方式如下:
向服务器传输数据,并等待服务器端回复 。无条件等待,直到接收完服务器端的回声数据后,才能传输下一批数据 。
传输数据后要等待服务器端返回的数据,因为程序代码中重复调用了 read 和 write 函数 。只能这么写的原因之一是,程序在 1 个进程中运行,现在可以创建多个进程,因此可以分割数据收发过程 。默认分割过程如下图所示:
文章插图
从图中可以看出,客户端的父进程负责接收数据,额外创建的子进程负责发送数据,分割后,不同进程分别负责输入输出,这样,无论客户端是否从服务器端接收完数据都可以进程传输 。
分割 I/O 程序的另外一个好处是,可以提高频繁交换数据的程序性能,图下图所示:
文章插图
根据上图显示可以看出,再网络不好的情况下,明显提升速度 。
10.5.2 回声客户端的 I/O 程序分割
下面是回声客户端的 I/O 分割的代码实现:
可以配合刚才的并发服务器进行执行 。
编译运行:
gcc echo_mpclient.c -o eclient./eclient 127.0.0.1 9190
结果:
文章插图
可以看出,基本和以前的一样,但是里面的内部结构却发生了很大的变化
10.6 习题
- 摩登家庭第五季是什么电视
- 《csgo》竞技模式几个设计优秀的系统
- 傲剑狂刀是什么电视剧
- 傲剑狂刀人物怎么转换
- 20189218 2018-2019-2 《密码与安全新技术专题》第5周作业
- 《最重要的事,只有一件》笔记——目标不是做得更多,而是让自己需要的事情更少
- 【咸鱼之王】《食神》联动活动联动答题三
- 永磁同步电机超调控制
- 论文解读《Semi
- 《Head First》 设计模式之一 Strategy model