1

telnet セッションの入力行をバッファーから削除して、Enter キーを押すと、入力したテキストが削除されますが、telnet サーバーには送信されますか?

カーソルを行の先頭に移動し、その行を新しい行で上書きする特定の文字を送信する方法があることは知っていますが、新しい行の文字がバッファに入れられるため、それを超えることはできません. これを回避する方法はありますか?

例: (2 行目はユーザー入力です)

Welcome to my imba text game!
pick up axe

次に、Enter キーを押すと、スクリーン バッファが次のように表示されます。

Welcome to my imba mud game!
[You picked up the axe]

アップデート:

重要なのは、ローカル入力をエコーし​​ないモードにtelnetクライアントを設定することだと思います。クライアントにいくつかのマジック キャラクタを送信すると、モードを変更できることがわかりました。この例を見つけましたが、それが何を意味するのかわかりませんが、入力が telnet クライアントに表示されなくなります。ただし、入力がサーバーに送信されることはないため、答えの半分に過ぎません。

socket.send("\377\375\042\377\373\001")

たぶん、入力を1行ずつ読んでいるからでしょう。char by charとして読みたいと思います。ただし、これを変更する方法がわかりません:

fileobj = socket.makefile()
while True:
    line = fileobj.readline()
    ...
4

2 に答える 2

1

ソケット API は元のソケット モジュールに似ているため、この問題は gevent と特別な関係はないと思います。そして、質問は、gevent の準並列 greenletes 実行の影響を受けません。fileobj.readline() の代わりに socket.recv() を使用してみてください。

于 2012-01-10T12:11:34.417 に答える
0

結局 socket.rscv() を使用しましたが、それが重要かどうかはわかりません。解決策は、接続時に telnet クライアントに送信するネゴシエーション文字の魔法のシ​​ーケンスでした。

socket.send(chr(0xff) + chr(0xfb) + chr(0x01) + chr(0xff) + chr(0xfb) + chr(0x03) + chr(0xff) + chr(0xfd) + chr(0x0f3))

これは基本的に、クライアントに char by char モードを使用し、ローカル エコーをオフにするように指示します。そのようにして、char を受け取ると、それを lineBuffer に追加し、"\r" プレフィックスを付けて送り返し、最後の行を上書きします。char が return char の場合、lineBuffer を解析します。よく働く!

于 2012-01-11T15:16:37.063 に答える