繁体   English   中英

有时从 NetworkStream 读取数据会损坏

[英]Reading from NetworkStream some time get corrupt data

我有一个 C++ 服务器发送订单格式如下:前 3 个字节是消息长度,消息的 rest 是这样的:

enum_code 状态 0.000000 0.000000 52.260000 52.270000 0.000000 0.000000 0 0 0 0.000000 0.000000 0.000000 1000 0.000000 53.660000 名称

我正在像这样读取缓冲区:

private void RecieveMsg(out String message)
{
    message = "";
    byte[] bytes = new byte[3];

    while (!_netStream.DataAvailable)
    {
    }
    //work around for gurbgh data from tcp connection;
    Thread.Sleep(10);

    if (_netStream.DataAvailable)
        _netStream.Read(bytes, 0, 3);

    string returndata = Encoding.ASCII.GetString(bytes);
    //System.Console.WriteLine("RecieveMsg().Header:: " + returndata);
    Int32.TryParse(returndata, out int number);
    byte[] _temp = new byte[number + 1];
    StringBuilder myCompleteMessage = new StringBuilder();
    int totalByetsRead = 0;
    int numBytesRead = _netStream.Read(_temp, 0, number + 1);
    message += Encoding.ASCII.GetString(_temp, 0, numBytesRead);
    totalByetsRead += numBytesRead;
    while (totalByetsRead < (number + 1))
    {
        byte[] remaindata = new byte[(number + 1 - numBytesRead)];
        numBytesRead = _netStream.Read(remaindata, 0, remaindata.Length);
        totalByetsRead += numBytesRead;
        message += Encoding.ASCII.GetString(remaindata, 0, numBytesRead);
    }

    message = Encoding.ASCII.GetString(_temp);
    return;
}

如果我收到超过 10 条消息,我将开始阅读其中的一些:

禁用 0.000000 0.000000 0.000000 0.000000.00 ????????????????????????

您的最后一条语句message = Encoding.ASCII.GetString(_temp)会覆盖您到目前为止在message变量中建立的所有内容。 如果第一次读取不包含完整数据,则第一个numBytesRead字节之后的所有内容基本上都包含垃圾。

只需删除这一行,您的代码就会起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM