1. 程式人生 > >python telnetlib 中各種 read 函式的意義

python telnetlib 中各種 read 函式的意義

基本原理

要明白 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 函式的意義

各種 read 函式的不同就在於它們所包涵的階段不同。

read_very_lazy
只從 cookedq 讀取已處理好的資料。
read_lazy
如果 rawq 有資料,對 rawq 裡的資料進行處理,然後從cookedq 中讀取處理好的資料。
read_eager
從系統的 socket buffer 接受資料(即非阻塞模式1讀取資料)並處理,然後從 cookedq 中讀取資料。
read_very_eager
與 read_eager 類似。不同之處在於 read_eager 只要從

cookedq 成功讀取到資料就返回,而 read_very_eager 會試圖讀儘可能多的資料。

其它
剩下的 read 函式基本上就是阻塞式等待網路資料,直到讀到所需資料。

1. 關於非阻塞的說明:本文提到的非阻塞是對接收普通資料而言的,也就是 python 文件中的“ Do not block unless in the midst of an IAC sequence.”