我有一个基于套接字的应用程序,它在客户端使用BinaryReader对象公开接收到的数据。我一直在尝试调试阅读器中包含的数据不干净的问题……也就是说,我正在读取的缓冲区包含的旧数据超过了新数据的大小。
在以下代码中:
System.Diagnostics.Debug.WriteLine("Stream length: {0}", _binaryReader.BaseStream.Length);
byte[] buffer = _binaryReader.ReadBytes((int)_binaryReader.BaseStream.Length);当我注释掉第一行时,数据不会像使用print line语句时那样变脏(或者不会变得经常变脏)。据我所知,从服务器端来的数据是干净的,所以我的套接字实现可能有一些问题。但是,有人知道为什么添加打印行会导致数据更频繁地变脏吗?
发布于 2012-02-11 01:59:54
您的二进制读取器看起来像是一个私有成员变量(如果前导下划线是一个tell tell符号)。
你的应用程序是多线程的吗?当你从你的binaryReader中读取数据时,如果另一个线程也试图使用你的use,你可能会遇到竞争的情况。即使没有这一行,你也会遇到问题,这一事实对我来说似乎很可疑。
发布于 2012-02-11 04:17:37
您确定您的读取逻辑正确吗?Stream.Length表示整个流的长度,而不是要读取的剩余数据的长度。
假设最初有100个字节可用。Length为100,并且BinaryReader更正读取的100个字节,并将流位置前进100。然后,又有20个字节到达。Length现在是120;但是,您的BinaryReader应该只读取20字节,而不是120字节。在第二次读取中请求的‘额外’100个字节将导致它阻塞或(如果流没有正确实现)中断。
发布于 2012-02-11 06:56:31
这个问题既愚蠢又无关紧要。然而,我相信我上面的阅读逻辑是正确的。问题是,我使用的_binaryReader是一个不属于我的类的引用,因此底层流被用坏数据重写。
https://stackoverflow.com/questions/9232357
复制相似问题