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请求中询问的数据量。对于远程流(原始网络、HTTP、远程文件系统)尤其如此。

简单的解决方案是包装流StreamReader,它将负责正确处理流中的部分读取以及编码。

替代解决方案 - 在网络流上包装另一个自定义流以首先读取和缓冲所有数据(请注意,在网络流的情况下,“全部”可能难以定义)。

于 2013-09-05T18:48:37.363 回答