2009-06-01 105 views
0

我在寫一個簡單的telnet客戶端庫。我使用fsockopen()打開套接字並使用fgetc()和fwrite()讀取和寫入套接字。我使用fgetc()而不是fread()來處理Telnet特殊命令和選項,如(IAC,...)。讀取從PHP中的套接字接收的所有數據

問題是,我正在從套接字讀取大部分時間,它需要很長時間才能返回。正如我所描述的那樣,只要連接超時,然後我就會得到結果。

這裏是我的閱讀方法:

protected function getChar() 
{ 
    $char = fgetc($this->_socket); 
    return $char; 
} // public function getChar() 

目前我用這個條件來確保流結束:

$char = $this->getChar(); 
if ($char === false) { 
    // end of the stream. 
} 

是那裏流結束的以找出任何其他方式所有數據都被讀取?

更新:我認爲Telnet協議中的EOF字符不是PHP期望的EOF,這就是爲什麼腳本無法找到流結束的原因。有誰知道Telnet協議中的EOF(文件結束)字符是什麼?

+1

Telnet會話是全雙工還是半雙工? – 2009-06-10 06:27:33

+0

我不確定。我怎麼知道? – farzad 2009-06-10 17:17:35

回答

1

嘗試回顯您收到的每個字符的十六進制值。您應該能夠看到您正在接收的EOF,即使PHP不承認它。看看ord()bin2hex()

1

feof()這可能是有用的。

+0

我也試過,沒有幫助。根據PHP文檔feof()返回 當文件指針是EOF時,feof()返回true,當文件指針是EOF時,fgetc()返回false。所以我不確定$ char === false和feof()之間是否有區別。在那兒? – farzad 2009-06-01 07:23:53

+1

可能不是。如果連接完全關閉,EOF將立即返回。如果它要超時,你不會知道。 – grawity 2009-06-01 13:25:41

0

我搜索了但沒有發現任何有用的東西。然後我試圖找出python中的telnetlib爲這個問題做了什麼(我只是學習python),我發現即使python庫不搜索EOF。它會一直讀取流直到它超時,或者經過一段時間,或者搜索特殊字符串返回結果。所以我用同樣的方法閱讀並解決了我的問題。感謝所有的答案和評論。我會盡力說服我的公司使用開源兼容許可證分發這個telnet庫。如果發生這種情況,我會在這裏更新。

0

Telnet沒有流標記(char)結束。 它只是發出提示並停止發送。 所以最好的方法是在提示文本上捕獲輸出流。