一:概述
在简单的回射服务例子中,客户端和服务器的交互步骤如下:
客户从标准输入中读入一行文本,并写给服务器;
服务器从网络输入读入这行文本,并回射给客户;
客户从网络输入读入这行回射文本,并显示在标准输出上。下图描述了整个过程:
二:多进程的str_cli
其中客户端的str_cli函数处理客户端上的主要逻辑:从标准输入读入一行文本,写到服务器上,然后读会服务器对改行的回射,写到标准输出。
str_cli的非阻塞版木比较复杂--约有135行代码(P342),与之相比,使用select和阻塞式IO的版木有40行代码(P137),而最初的停-等版本(P100)则只有区区20行代码。
代码长度从20行倍增到40行的努力是值得的,因为在批最模式下执行速度几乎提高了30倍,而且在阻塞的描述符上使用select不太复杂。然而考虑到结果代码的复杂性,把应用程序编写成使用非阻塞式IO的努力足否照样值得?答案是否定的。每当我们发现需要使用非阻塞式IO时,更简单的办法通常是把应用程序仟务划分到多个迸程〔使用Fork〕或多个线程。
下面是使用多进程的版本:
#include "unp.h"
void str_cli(FILE *fp, int sockfd)