分类: Python/Ruby
2009-08-01 15:56:04
Created: Fang lungang 07/06/2007 Modified: Fang lungang 07/09/2007 10:27>
最近想用 python 的 telnetlib 写个测试脚本。可是 telnetlib 里一堆的 read 函数, 又是 lazy 又是 eager 的;搞不清楚它们之间的区别。在 python 文档和 google 上搜索也没有任何结果。好在 python 是开源的,找到源码一看, 还是比较简单明了。
要明白 telnetlib 中各个 read 函数的意义,首先要了解 telnetlib 的工作原 理。 telnetlib 首先通过 socket 连接从网络接收数据,把数据存储到自己的 raw queque 中,然后对其进行(telnet 协议相关的)处理(cook)。处理结果 存放在 cooked queue 中供应用程序取用。整个过程如下图.
---------, ,----------, ,-----, ,--------, ,-----------,
network |=====>|socket buf|=====>|raw-q|=====>|cooked-q|=====>|application|
---------` `----------` `-----` `--------` `-----------`
| | | | |
| | | | |
| | | |---------------|
| | | read_very_lazy |
| | | |
| | |------------------------------|
| | read_lazy |
| | |
| |------------------------------------------------|
| read_very_eager/read_eager |
| |
|----------------------------------------------------------------|
| read_until/read_all/read_some/expect |
各种 read 函数的不同就在于它们所包涵的阶段不同。
cookedq 成功读取到数据就返回,而 read_very_eager 会 试图读尽可能多的数据。
关于非阻塞的说明:本文提到的非阻塞是对接收普通数据而言的,也就是 python 文档中的“ Do not block unless in the midst of an IAC sequence.”