基本原理
要明白 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 函數基本上就是阻塞式等待網絡數據,直到讀到所需數據。