[英]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.