簡體   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