C#TcpClient ReadAsync读取大消息

C#TcpClient ReadAsync读取大消息,c#,asynchronous,tcpclient,C#,Asynchronous,Tcpclient,我有一个C#TcpClient异步读取数据。简化代码如下: public async Task StartReading(CancellationToken token) { // To fit the largest package const int BufferSize = 524288; while(true) { var buffer = new byte[BufferSize]; int bytesRead = a

我有一个C#TcpClient异步读取数据。简化代码如下:

public async Task StartReading(CancellationToken token)
{
    // To fit the largest package
    const int BufferSize = 524288;

    while(true)
    {
         var buffer = new byte[BufferSize];
         int bytesRead = await this.networkStream.ReadAsync(buffer, 0, BufferSize);
                                          .WithWaitCancellation(token);            

            if (bytesRead > 0)
            {
                 Console.Read(string.Fromat("{0} bytes received."));

                 // Run processing at background process
                 Task.Run(() => ProcessData(buffer, bytesRead));
            }
            else
            {
                // If received 0 bytes then a tcp connection is terminated
                break;
            }
    }
}
收到的包可能包含一条或多条以STX开头、以ETX结尾的消息,不发送包长度。此源由第三方提供,不会更改。

在测试过程中,服务器似乎以8192个数据块的形式发送数据,因此消息可能被拆分为两个后续的chunck,并且无法处理
这里有一个日志:
接收到8192字节
消息89已处理/1失败
接收到8192字节
已处理消息89/2失败
接收到8192字节
已处理消息89/2失败
接收到2349个字节
已处理邮件34/1失败

同步读取也没有帮助。如何管理它?

从根本上说,TCP是一种基于流的协议。您试图将其视为基于数据包的协议。不要那样做

数据提供了它自己的分隔符-所以使用它。如果没有完全接收到消息,请记住这些字节,然后在接收到消息的其余部分时处理它们。(请记住,消息也有可能在下一次读取调用时无法完全接收…

基本上,TCP是一种基于流的协议。您试图将其视为基于数据包的协议。不要那样做

数据提供了它自己的分隔符-所以使用它。如果没有完全接收到消息,请记住这些字节,然后在接收到消息的其余部分时处理它们。(请记住,下一次读呼叫也可能无法完全接收到消息…)