1

これはかなり複雑な質問であり、そのことをお詫び申し上げます。私は単純なチャット サーバーの基本的なフレームワークである Linux C ソケット アプリケーションを作成しました。サーバーはラップトップで実行されています。指定されたクライアント アプリケーションを作成するまで、現時点ではクライアントは Telnet です (より安全になることを願っています)。クライアント エンドから一般的なネットワーク データを送信するためのより優れたアプリケーションがあることは知っていますが、ある Telnet クライアントで特定のことが発生し、別のクライアントでは発生しない理由に興味を持ちました。

最初の Telnet クライアント テストは、別の Linux ラップトップで行われました。期待どおりに動作します。ただし、次は、Telnet および SSH 接続を可能にする BBSSH と呼ばれる Blackberry アプリでした。私は Telnet オプションを使用しましたが、これも機能します。ただし、正確にはそうではありません。

サーバーコードは通常のread呼び出しを行ってデータのブロックを取得します。これは文字列、つまりメッセージとして扱われます。以前のクライアントは、私が Enter キーを押すまで読み取り、その後 1 つの文字列を送信します。しかし、BB アプリは、あたかも私がそれらの後にエンターを押したかのように、すべての文字を送信しますが、私はそうしていません。明らかに、これはバッファリング、ユーザー入力からの EOL としての特定のクライアント クラスなどと関係があります。私はそれを特定することはできません。

説明のために、クライアントから受信したメッセージを出力するサーバーを次に示します。

まず、Linux クライアントからのメッセージ:

client name: this is a test

次に、BBSSH の場合:

client name: t
client name: h
client name: i
client name: s
client name:
client name: i
client name: s
client name:
client name: a
client name:
client name: t
client name: e
client name: s
client name: t

何か助けはありますか?

4

2 に答える 2

3

Telnetクライアントは、ラインモードまたは文字モードで動作できます。BBSSHクライアントは、何らかの理由で文字モードで動作しているようです。

telnet接続の開始時に行われるネゴシエーション中に、サーバーがクライアントにその旨の命令を送信することにより、クライアントを強制的にラインモードにする可能性があります。

サーバーがクライアントに送信する必要のあるバイトシーケンスは0x2550x2530x34であり、これは「コマンドとして解釈、実行、ラインモード」と解釈されます。クライアントがラインモードで動作する意思がある/できる場合は、0x255 0x251 0x34( "Interpret As Command、Will、Linemode")で応答する必要があります。

これがまったく新しい場合(つまり、Telnetサーバーが現在ネゴシエーションをまったく行っていない場合)、「Telnetネゴシエーション」などの用語をグーグルで検索するか、関連するRFCSの一部を確認してください(RFC 854はTelnet自体、RFC 1184 Linemodeオプションをカバーしています)。

于 2012-07-30T14:57:12.683 に答える
2

TCP はストリーム指向であるため、「メッセージ」などはありません。すべてのデータをまとめて受け取る場合もあれば、一度にその一部を受け取る場合もあります。

あなたの場合、EOL マーカーに到達するまで、受信したものをすべてバッファリングすることができます。

于 2012-07-30T14:42:20.370 に答える