原です。
遅い返信になってしまいました。
In message "[ruby-list:16765] Re: mn128.rb & telnet.rb"
on 99/09/14, wakou / fsinet.or.jp <wakou / fsinet.or.jp> writes:
|
|青山です。
|わざわざ記述が複雑になる可能性のあるメソッドに成長させるよりは、cmd 等
|を利用して、その場に応じた処理、あるいはオリジナルの login メソッドを
|書いて頂いた方が良いと思います。2行〜4行程度の事ですから。
確かにそうですね。
|> 難しいのは telnet というより、「オートパイロット」させようとした
|> 時に、サーバが出してくるプロンプトを捕まえることでした。どうして
|> もタイムアウトとの絡みが出る。結局、sysread を使って自前のバッファ
|> を繰るしかなくて、そこが面倒な所でした。(ちょうど、さっき ruby-dev
|そうなんですよね。タイムアウトというか、サーバーからのデータが**とりあ
|えず現状では**これで最後だという何かが必要なんですよね。
|
|ところが、これがあくまでその時点での状態であって、すぐに続きが来る可能
|性もあれば、ネットワークの途中の状態による影響などもあったりと、やはり
|タイムアウトや、thread で同時進行させて文字列から判断等もなかなかうま
|くいきません。
今日は telnet.rb を参考にいろいろやってみたんですが、結局 telnet.rb
で使っている心臓部分のアルゴリズム以上に良いものは出来ませんでした。
もうちょっと違うインタフェース(パソコン通信ソフトのマクロの様な)
も考えて見たのですが、いまいち。
thread も read(n) で読み込んでる途中のスレッドを kill すると、
バッファ内の文字は消えてしまうみたいで、意外と使いにくい。
|やはり、面倒でも select でサーバーに問い合わせるのが安心のようなので、
|あのようにしてみました。しかし、これもサーバーの負荷が異常に高い場合に
|は、サーバーの答えも良くない場合がまれにあるようで、最悪の場合には
|select での判断も失敗するようです。
select っていうのは、ソケットに使うとサーバーにパケットが飛ぶの
ですか、、結構重い関数なんですね。
|> 質問をひとつ。Telnet クラスがメソッドをソケットに SimpleDelegator
|> を使って委譲させているのはなぜでしょう。必要なら TCPsocket のサブ
|> クラスにしてしまう手もあるかとも思いますが。
|
|簡単だったからです。本当になにも考えていなかったのですが、ちょっと試し
|てみると、TCPSocket のサブクラスにする場合、new も書かなければならない
|ようですね。(その中で、オブジェクトの生成の記述も必要みたいですね。)
なるほど。私は Telnet.open で生成させる事を考えていたんですが、
それでも明示的に何らかの初期化メソッドを呼ぶ必要が出てきますね。
しかし良く考えてみると、Telnet では sysread を使っているので、
Telnet のインスタンスには read も gets も getc も避けなければ
なりませんね。使えるのは close, closed? ぐらいかなあ。
あ、出力系があるか、、、