[C#] NetworkStream.Write()存在严重bug - 中国WEB开发者网络 (http://www.webasp.net) -- 技术教程 (http://www.webasp.net/article/) --- [C#] NetworkStream.Write()存在严重bug (http://www.webasp.net/article/28/27517.htm) |
| -- 作者:未知 -- 发布日期: 2006-04-11 |
| NetworkStream.Write()方法实际上是不可用的,因为它无法保证数据的连续性。 先给大家看一段代码: //cln is an instance of TcpClient NetworkStream st = cln.GetStream(); st.Write(tosend, 0, tosend.Length); 这属于NetworkStream.Write()的标准调用方法。可是在catch到IOException之后,我们就会遇上大麻烦。 MSDN上没有对NetworkStream抛出的IOException做详细说明,因此我们只能参考它的基类Stream抛出的IOException的说明,MSDN上是这样说的:If an exception occurs, the position within the stream remains unchanged. 听起来很不错是不是?抓到IOException之后,再重新发送就可以了。可事实并不是这样的。事实是:当NetworkStream.Write()抛出一个IOException的时候,谁也不知道到底有多少个字节已经被发送出去了! 我们用了两天的时间来追踪数据重复的问题,最终的结果让人非常恼火。微软的NetworkStream没有做到他在MSDN里面承诺的“If an exception occurs, the position within the stream remains unchanged.”。 没办法,只能用下面这个方法凑合了: NetworkStream st = cln.GetStream(); IAsyncResult ar = st.BeginWrite(tosend, 0, tosend.Length, null, null); if(!ar.AsyncWaitHandle.WaitOne()) { ErrorLog.WriteError("fail to wait"); } st.EndWrite(ar); 至少目前看来NetworkStream.BeginWrite()抛出的异常还是比较准确的。 |
| webasp.net |