最近想用 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 函数的意义
各种 read 函数的不同就在于它们所包涵的阶段不同。
read_very_lazy只从 cookedq 读取已处理好的数据。read_lazy如果 rawq 有数据,对 rawq 里的数据进行处理,然后从cookedq
中读取处理好的数据。read_eager从系统的 socket buffer 接受数据(即非阻塞模式
并处理,然后从 cookedq 中读取数据。read_very_eager与 read_eager 类似。不同之处在于
read_eager 只要从cookedq 成功读取到数据就返回,而 read_very_eager 会试图读尽可能多的数据。
其它剩下的 read 函数基本上就是阻塞式等待网络数据,直到读到所需数据。
python 文档中的“ Do not block unless in the midst of an IAC
sequence.”
源文档 <http://it.chinawin.net/softwaredev/article-15a49.html>
各种read:
read_until(expected, [timeout])
Read until the expected string has been seen, or a timeout is
hit (default is no timeout); may block.
read_all()
Read all data until EOF; may block.
read_some()
Read at least one byte or EOF; may block.
read_very_eager()
Read all data available already queued or on the socket,
without blocking.
read_eager()
Read either data already queued or some data available on the
socket, without blocking.
read_lazy()
Read all data in the raw queue (processing it first), without
doing any socket I/O.
read_very_lazy()
Reads all data in the cooked queue, without doing any socket
I/O.
read_sb_data()
Reads available data between SB ... SE sequence. Don't block.
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 函数的意义
各种 read 函数的不同就在于它们所包涵的阶段不同。
read_very_lazy只从 cookedq 读取已处理好的数据。read_lazy如果 rawq 有数据,对 rawq 里的数据进行处理,然后从cookedq
中读取处理好的数据。read_eager从系统的 socket buffer 接受数据(即非阻塞模式
并处理,然后从 cookedq 中读取数据。read_very_eager与 read_eager 类似。不同之处在于
read_eager 只要从cookedq 成功读取到数据就返回,而 read_very_eager 会试图读尽可能多的数据。
其它剩下的 read 函数基本上就是阻塞式等待网络数据,直到读到所需数据。
python 文档中的“ Do not block unless in the midst of an IAC
sequence.”
源文档 <http://it.chinawin.net/softwaredev/article-15a49.html>
各种read:
read_until(expected, [timeout])
Read until the expected string has been seen, or a timeout is
hit (default is no timeout); may block.
read_all()
Read all data until EOF; may block.
read_some()
Read at least one byte or EOF; may block.
read_very_eager()
Read all data available already queued or on the socket,
without blocking.
read_eager()
Read either data already queued or some data available on the
socket, without blocking.
read_lazy()
Read all data in the raw queue (processing it first), without
doing any socket I/O.
read_very_lazy()
Reads all data in the cooked queue, without doing any socket
I/O.
read_sb_data()
Reads available data between SB ... SE sequence. Don't block.