zoukankan      html  css  js  c++  java
  • NetworkStream.Write()存在严重bug 转

    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()抛出的异常还是比较准确的。
  • 相关阅读:
    php知识点
    cdnbest里站点域名不同步到节点,报400错误的一般原因
    linux删除历史操作命令
    linux 查看进程启动路径
    Linux中systemctl命令详细介绍
    申请ssl证书报提示caa提示
    开启swap交换分区
    mysql里max_allowed_packet的作用
    抓包工具tcpdump用法说明--1
    echo和print的区别
  • 原文地址:https://www.cnblogs.com/liye/p/2212045.html
Copyright © 2011-2022 走看看