2

IMAPコマンドからの応答を受信するための次のc#/WinRTコードがあります

DataReader reader = new DataReader(sock.InputStream);
reader.InputStreamOptions = InputStreamOptions.Partial;
await reader.LoadAsync(1000000);
string data = string.Empty;
while(reader.UnconsumedBufferLength > 0){
    data += reader.ReadString(reader.UnconsumedBufferLength);
}

結果は、8192バイト後に切り捨てられます。8192は、ある種の制限のように不審に見えます。これを回避するにはどうすればよいですか?

4

1 に答える 1

2

TCP/IP ソケットの抽象化は、ブログで説明しているように、メッセージのストリームではなく、バイトのストリームです。LoadAsyncしたがって、部分的なメッセージまたは任意の数のメッセージの後に部分的なリターンがあるのは完全に正常です。

8192 は、ジャンボ フレーム (ギガビット イーサネット) のように聞こえます。あるいは、.NET レイヤーのデフォルトの読み取りサイズかもしれません。

とにかく、あなたが見ているのは完全に正常であり、TCP/IP 通信では受け入れられます。メッセージの終わりを検出するまでLoadAsync(および)をループする必要があります。ReadStringIMAP は、少なくともメッセージ区切りの一部で改行を使用していると思います。通常、メッセージが文字列の途中で終了する状況に対処する必要がありますが、IMAP の場合はこのチェックをスキップできる可能性があると思います。

于 2012-10-11T15:02:29.203 に答える