1

私はクライアントサーバーモデルのアプリケーションを書いています. サーバーはクライアントへのストリーム接続で非常に高速で大量のメッセージを (さまざまなサイズで) 送信します. クライアントはこれらのメッセージを予想されるメッセージサイズよりも大きなバッファで読み取ります.

while (ret = read (sd, buf, sizeof buf) > 0)
{
      // decode message here
}

ここでの問題は、クライアントがそのようなバッファで複数のメッセージを読み取る可能性があることです。バッファが B でメッセージが M# であると仮定すると、次のようにメッセージを受信します。

|----B----|----B----|----B----|----B----| ....

|-M1--|-M2-|--M3-|-M4-|---M5---|--M6-| ....

これにより、メッセージのデコードが正しくなくなります。だから、私は次のようにメッセージを受け取りたいです(バッファごとに1つのメッセージのみ)

|----B----|----B----|----B----|----B----| ....

|-M1--|,,|-M2-|,,,|--M3-|,,|-M4-| .... (,,, は何もありません。書式設定のためだけです)

ストリーミング接続を使用する必要があり、メッセージ間に区切り文字を使用したくないことに注意してください

4

2 に答える 2

3

ストリームのバイトがアプリケーションに配信される方法を制御することはできません。これは、個々のメッセージではなく、バイトのストリームです。

区切り文字が「好き」ではない場合でも、これがまさにそれらが頻繁に使用される理由です。これは楽しいアイデアではなく、この問題の基本的な解決策です。「好き」ではないので、反対意見が出るほど面白くありません。

区切り文字を除いて、あなたの唯一の望みは、完全なメッセージがあるかどうか、そしてある場合はどのメッセージがあるかを常に適切に判断できるメッセージ解析を実装することです。メッセージが「プレフィックス」の場合。バイトBの特定のシーケンスが完全なメッセージM1とM2の開始の両方になるように、あなたは乾杯していると思います。

于 2012-12-18T11:38:08.613 に答える
1

区切り文字には多くの種類があります。プロトコルで「違法」な文字が何であれ、優れた区切り文字になりますが、印刷可能な文字を選択できれば、スニファや telnet を使用するときにプロトコルが読みやすくなります。

XML または同様の構造化データに基づいてプロトコルを作成することもできます。これにより、より複雑な区切り文字が作成されます。

バイナリ プロトコルでは、TLV (http://en.wikipedia.org/wiki/Type-length-value) を使用することが多く、長さはメッセージのバイト数を指定します (値の部分のみ、または型、長さ、値の両方)。

于 2012-12-18T13:29:33.310 に答える