これはではありません。要求されたものより少ないストリームを処理する方法に関する質問。私はそれをどのように処理したかを示し、コメントは大歓迎です。StreamSocketに基づくストリームは、要求されたデータよりも少ないデータを返します
しかし、最初の最初のもの:
私はTCP通信のためのStreamSocket
をベースUWP
を使用しています。
StreamSocket strs = GetConnection();
Stream str = strs.InputStream.AsStreamForRead();
私たちは、送信を想定しています。最初の数バイトは、他のものの中で、伝送がどれくらい長くなるかを教えてくれます。次に、指定されたバッファサイズで指定された量のデータを読み込むメソッドにストリームを渡します。私はまったくの警告を取得していない小さな伝送のための
最初の実装
// commencing data read:
int ret = 0;
int total = 0;
for(int k = 0; k < size; k += buffserSize) {
int len = Math.Min(bufferSize, size - k);
ret = stream.Read(data, k, len);
if(ret != len)
Debug.WriteLine("Congestion: {0}/{1}", ret, len); // throw?
total += ret;
}
。しかし、より大きなトランスミッションの場合、トランスミッションが約40kBになると、私は一貫して、要求されるよりも少ないデータしか得られません。この実装ではデータが失われます。
ソリューション
だから私はに持ってネットワークストリームで読んブロッキングはいくつかの点で要求されたよりも少ないを返すことを考慮に入れます。だから私は、このソリューションを実装約40KB私は混雑を取得した後、再び
int bs = 4096;
int rpos = 0;
while(rpos < size) {
int len = Math.Min(bs, size - rpos);
int read = stream.Read(data, rpos, len);
if(read < bs) {
Debug.WriteLine("Congestion: {0}/{1}.", read, len);
bs /= 2;
}
rpos += read;
}
を、私はそれ(とボーナスとしてバッファサイズ=悪い-マン・フロー制御を減らす)
を占め、この時間これは
は、なぜ私は読んブロックに要求されたよりも少ないデータを返すためにTCPソケットに基づいてストリームを期待する必要があります実際の
をチェックする必要があり、「私は、これは以下の1つの抽象化層を処理する必要がありますと思いました。」どうして? TCPが提供する抽象化は、(潜在的に無限の)双方向のバイトストリームです。 * messages *が必要な場合は、自分で実装するか(ここでやっているように)、より高いレベルの抽象化に移行するかはあなた次第です。 –
私はストリームが提供する抽象概念を意味すると思います。しかし、私は誤解があるようです。私がnバイトを要求すると、ストリームが私にnバイトを与えると期待しています。特定の(まれな)状況においてのみ、ストリームが少なくなると期待します。 – MrPaulch
[文書化されています](https://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read(v = vs.110).aspx): " *利用可能なデータ量*、 'size'パラメータで指定されたバイト数まで(私の強調) –