2009-06-01 18 views
0

私は単純なtelnetクライアントライブラリを書いています。私はfsockopen()を使ってソケットを開き、fgetc()とfwrite()を使ってソケットを読み書きします。私はfread()の代わりにfgetc()を使って、Telnetの特別なコマンドやオプション(IAC、...など)を扱います。PHPのソケットから受け取ったすべてのデータを読む

問題はほとんどの場合、私はソケットから読んでいる、それは戻すには時間がかかりすぎるということです。私がそれをプロファイリングしたように、接続がタイムアウトする限り時間がかかり、その後は結果が得られます。

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

は、ストリームが終了したことを知るために、他の方法があります:

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

は現在、私は確信してストリームが終了されていることを確認するために、この条件を使用します。ここ

は私の読書の方法ですすべてのデータが読み込まれますか?

Udate:TelnetプロトコルのEOF文字は、PHPがEOFとして期待しているものではないと思います。そのため、スクリプトはストリームの終わりを見つけることができません。 TelnetプロトコルのEOF(ファイルの終わり)文字は何ですか?

+1

Telnetセッションのフルデュプレックスまたはハーフデュプレックスですか? –

+0

わかりません。どうすればわかるのですか? – farzad

答えて

1

受信した各文字の16進値をエコーアウトしてみてください。 PHPがEOFとして認識していなくても、EOFとして受け取っているものだけを見ることができます。 ord()bin2hex()

+0

良いアイデア。私はそれを試して、特殊文字がないことを発見した。 :D – farzad

1

有用かもしれないfeof()があります。

+0

私もそれを試みた、助けていない。 PHPドキュメントphof()による は、ファイルポインタがEOFの場合はtrueを返し、ファイルポインタがEOFの場合はfgetc()はfalseを返します。だから、$ char === falseとfeof()の間に違いがあるかどうかはわかりません。ある? – farzad

+1

おそらくそうではありません。接続がきれいに閉じられた場合、EOFはすぐに返されます。タイムアウトになると、あなたは知らないでしょう。 – grawity

0

私は検索して何も役に立たなかった。 Pythonのtelnetlibがこの問題(私はPythonを学んでいるだけです)のために何をしているのか調べようとしましたが、PythonライブラリでさえもEOFを検索しないことが分かりました。タイムアウトするまでストリームを読み続けるか、一定の時間が経過するか、特殊文字列を検索すると結果が返されます。私は同じ方法を読んで問題を解決しました。すべての答えとコメントをありがとう。私は私の会社にオープンソース互換のライセンスでこのtelnetライブラリを配布するよう説得しようとします。これが起こった場合、私はここで更新します。

+0

telnetライブラリが完成し、長年働いています。私のマネージャーは、Apacheライセンスバージョン2.0でソースコードをリリースすることに同意しました。すぐにダウンロードURLを投稿します。 – farzad

0

Telnetにストリームトークン(char)の終了がありません。 プロンプトを送信して送信を停止するだけです。 プロンプトテキストに出力ストリームをトラップするのが最善の方法です。

関連する問題