0

簡単なtelnetクライアントライブラリを作成しています。fsockopen()を使用してソケットを開き、fgetc()とfwrite()を使用してソケットの読み取りと書き込みを行います。私はfread()の代わりにfgetc()を使用して、(IAC、...)のようなTelnetの特別なコマンドやオプションを処理します。

問題は、ほとんどの場合、ソケットから読み取っていて、戻るのに時間がかかりすぎることです。プロファイルを作成したので、接続がタイムアウトするまで時間がかかり、その後結果が得られます。

これが私の読み方です:

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

現在、この条件を使用して、ストリームが終了していることを確認しています。

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

ストリームが終了し、すべてのデータが読み取られたことを確認する他の方法はありますか?

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

4

4 に答える 4

1

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

于 2009-06-10T17:23:22.977 に答える
1

feof()役に立つかもしれないことがあります。

于 2009-06-01T07:05:36.200 に答える
1

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

于 2009-06-03T16:51:30.410 に答える
0

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

于 2012-10-05T16:00:49.300 に答える