9

この質問の@Len-Holgateのアドバイスに基づいて、0バイトの読み取りを非同期に要求し、コールバックで同期読み取りで使用可能なバイトを受け入れます。これは、データが使用可能でブロックされないことがわかっているためです。これはとても効率的で素晴らしいようです。

しかし、SslStream のオプションを追加すると、このアプローチは崩壊します。ゼロバイトの読み取りは問題ありませんが、SslStream はバイトを復号化し、TcpClient のバッファーにゼロのバイト数を残して (適切に)、読み取りに使用できる SslStream のバイト数を判断できません。

これに簡単なトリックはありますか?


コンテキストのためだけに、いくつかのコード:

sslStream.BeginRead(this.zeroByteBuffer, 0, 0, DataAvailable, this);

EndRead() (正しく 0 を返す) の後、DataAvailable には以下が含まれます。

// by now this is 0, because sslStream has already consumed the bytes
available = myTcpClient.Available; 

if (0 < available) // Never occurs
{
    // this part can be distractingly complicated, but 
    // it's based on the available byte count
    sslStream.Read(...); 
}

また、プロトコルのために、バイト単位で評価し、可変バイト幅の Unicode などをデコードする必要があります。バイト単位で非同期に読み取る必要はありません。

4

1 に答える 1

1

私の理解が正しければ、メッセージは特定の文字で区切られておりStringBuilder、メッセージが複数の部分に断片化されている場合をカバーするために既に を使用しています。

データを読み取るときに区切り記号を無視し、データが使用可能になったときにデータを追加してから、ローカルStringBuilderで区切り記号を検査することを検討できます。見つかったら、区切り文字がなくなるまでsb.ToString(0, delimiterIndex)andを使用して単一のメッセージを抽出できます。sb.Remove(0, delimiterIndex)

これは、2 つのメッセージが同時に受信された場合にも適用されます。

于 2014-09-30T11:34:19.543 に答える