2015-09-02 54 views
0

我想使telnet連接到服務器併發送命令。我成功地建立了連接併發送了命令,但是當我想用fgets讀取結果時,它將返回空字符串。PHP fgets返回空字符串

$socket=fsockopen($host, 25, $errno, $errstr); 
if ($socket!==false){ 
    fputs($socket, "helo hi\r\n"); 
    fputs($socket, "quit\r\n"); 
} 
fclose($socket); 
$buffer=array(); 
while (!feof($socket)){ 
    $buffer[]=fgets($socket); 
} 

該代碼返回帶有fgets的空字符串,並且不會在流輸出中產生文件指針。那有什麼問題?

+7

也許你在閱讀之前不應該關閉你的連接。 –

+0

@CharlotteDunois做出答案。 – Barmar

+1

我打開門,然後關上門,然後叫我的貓。裏面沒有貓。 – AbraCadaver

回答

3

在嘗試讀取套接字返回之前關閉連接。

想象一下:除非明確告訴你這樣做,否則你什麼都記不得。
做下面的大腦遊戲:打開一個文件。現在寫一些東西。然後關閉它。現在告訴我所說的文件的內容。你也會告訴我你不知道,因爲你沒有讀到它裏面的內容。你在閱讀它之前先關閉它,因此不知道里面寫了什麼。

我們從中學到了什麼?我們需要在之前讀取插座,然後關閉它。

$socket = fsockopen($host, 25, $errno, $errstr); 
if($socket !== false) { 
    fputs($socket, "helo hi\r\n"); 
    fputs($socket, "quit\r\n"); 
} 

$buffer = array(); 
while(!feof($socket)) { 
    $buffer[] = fgets($socket); 
} 
fclose($socket); 
+0

感謝您的回答。我記得要發送quit命令,否則feof會產生一個無限循環,因爲它等待新添加的輸出行,但是在我搜索輸出之前意外地記錄了fclose命令。 – kukko