• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

[C#]NetworkStream.Write()存在严重bug

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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()抛出的异常还是比较准确的。

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#利用委托事件进行窗体间的传值(新手必看)发布时间:2022-07-10
下一篇:
C#多线程AutoResetEvent与ManualResetEvent(转)发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap