UNP卷一I/O口复用中对图6.9程序的讨论(尤其是该程序不支持批量输入的缺点)

来源:互联网 发布:centos 7 锁屏 编辑:程序博客网 时间:2024/06/05 00:39

I/O口复用前面还挺多内容的。。。有一部分是讲select函数怎么用吧

这部分就自己慢慢看吧。。


下面开始讨论str_cli函数(修订版)这个程序的内部运行


首先图6.8给了个图,修订版的str_cli函数其实就是改成阻塞在select函数。select函数会有返回(也就是原本阻塞的select函数突然因为某些条件返回了,代码继续往下运行了)的三个条件:

1、对端(服务端)发送数据  

2、服务端发送一个FIN给客户端 (我们在使用kill 掉那个服务端子进程的时候)

3、服务端发送一个RST (主机崩溃,这里涉及到第5章的知识)


代码很简单,就是先设置监听的套接口描数字集合fd_set类型,然后阻塞在select函数那里,当监听的套接口有“反应”(就是使得select不阻塞的条件如上三个),select函数返回一个值  (如果设置了时间还有超时一种情况)。然后由于select函数返回,我们就开始检查是哪个套接口描述字干的事情(使得select不阻塞这件事)


这个函数似乎天衣无缝,但后面就开始讨论这个函数的缺点了 ----------不支持批量输入

首先谈谈什么叫做批量输入,我们在显示屏上敲键盘输入的那个不叫做批量输入,举个批量输入的例子,也就是我们即将讨论的文件当做标准输入流,这个就算是批量输入


好的,首先UNP卷一在6.5节开始跟我们讨论了TCP中全双工管道的发送接收的情况,并且配了图,其实看过计算机网络就知道,我们发送了请求1不可能等待收到应答1之后再发送请求2,因为这个很影响传输效率!这个图6.10挺简单的,就是说(请求1请求2……请求n)在条件允许的情况下会接二连三的发,其中会有一些如何使得网络负载均衡啥的问题,但在这不是重点。其实就是 请求应答都会接二连三一个接一个的发  


好的,我们开始讨论批量输入啦

那些程序在www.unpbook.com上有,下载下来后用gcc编译好后先运行服务端后。(额,如果这些不会我建议你还是先看看前面的吧)

我们运行客户端是要重定向标准输入流才可以发觉这个修订版的程序对批量输入的不支持!  我们可以写一个小文本test,在那随便输入几行字。

然后运行客户端的时候的命令中后面接个重定向   <test  。(学过shell一些命令都会)

然后你就会发现客户端输出:

str_echo: read error: Connection reset by peer

为什么呢?

我们这里文件中末尾是EOF字符,我们在把整个文本输入到套接口时候,也把EOF输入到那里了,可以看看服务端子进程中str_echo程序,对于发送过来的EOF会被readline返回0,然后退出了str_echo,然后退出了服务端为客户端开的子进程。。

而我们批量输入一般重定向都是文本,文本的末尾通常是EOF,read函数读到EOF会返回0.。服务端子进程中read函数之后读取0后退出while循环,也就退出了子进程。


但文本前几行的东西怎么没有输出到客户端那里呢,我又试了试把运行客户端命令重定向输出为一个文本,然后运行后打开那个文本,还是什么都没有。

我猜测是MAXLINE的原因,我输入的文本字节太少,read函数一次读完了也读到了EOF,于是没有执行那个write。。


可惜快要回宿舍了,可以试着改str_echo函数试试,把MAXLINE改小一点,改成4啊什么的。。


欢迎大家提出错误和批评!求评论!



0 0
原创粉丝点击