2

次の読み取りコールバック関数があります。この関数では、TCP データ送信の内容全体を読み取り、それらの内容に対して作業を実行します。8192 バイト未満の送信を読み取ると、うまく機能します。ただし、8192 バイトを超える転送が検出されると、最初の 8192 バイトで作業を実行し、その後の 8192 バイトに対して関数を再度実行します。networkStreamコードのステップ実行中にオブジェクトを調べると、SystemNotSupported例外が表示されます。「このストリームはシーク操作をサポートしていません。」

例外処理が投稿されたコードに吸い込まれていることに気付きました。これは現時点ではサンドボックス テストであり、運用コードではありません。

データに対して作業が実行される前に、コールバック関数で送信全体をキャプチャしたいと考えています。これどうやってするの?

    private void ReadCallback(IAsyncResult asyncResult)
            {
                Client client = asyncResult.AsyncState as Client;
                if (client != null)
                {
                    NetworkStream networkStream = client.NetworkStream;                
                    int read;
                    try
                    {
                        read = networkStream.EndRead(asyncResult);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                        return;
                    }

                    if (read == 0)
                    {
                        return;
                    }

                    try
                    {
                        byte[] data = new byte[read];
                        Buffer.BlockCopy(client.Buffer, 0, data, 0, read);
                        string message = win1252.GetString(data).TrimEnd('\u001a', '\r', '\n'); //decode the transmission
                    //Do work on received message here...
                    } 
                    catch (Exception ex)
                    {
                         MessageBox.Show(ex.Message);
                         return;
                    }
4

1 に答える 1

1

リクエストで要求した量のデータを返すためにストリームに依存することはできませんRead。これは特に、リモート ストリーム (raw ネットワーク、HTTP、リモート ファイル システム) に当てはまります。

StreamReader簡単な解決策は、ストリームからの部分読み取りとエンコードを適切に処理するようにストリームをラップすることです。

別の解決策 - ネットワーク ストリーム上に別のカスタム ストリームをラップして、最初にすべてのデータを読み取ってバッファリングします (ネットワーク ストリームの場合は「すべて」を定義するのが難しい場合があることに注意してください)。

于 2013-09-05T18:48:37.363 に答える