`
emowuyi
  • 浏览: 1480219 次
文章分类
社区版块
存档分类
最新评论

[C#] 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()抛出的异常还是比较准确的。
分享到:
评论

相关推荐

    C#Socket编程

    1.侦听器TcpListener,开始侦听。 2。启动 Listener 对象objTcpListener.Start(); 接受客户端请求objTcpListener.AcceptTcpClient,返回一个TcpClient,在... 4、服务器端开始接收,使用NetworkStream.read();

    C#源代码 如何实现点对点的聊天

    C#源代码 如何实现点对点的聊天,一个比较详尽的实现点对点聊天的源代码 核心代码: string MyMessage= this.textBox2.Text+":"+this.richTextBox1.Text+"\n"; //根据目标计算机地址建立连接 TcpClient ...

    C#学习文档实例讲解

    2.1.2 使用NetworkStream对象发送和接收数据 30 2.1.3 TcpClient与TcpListener类 31 2.1.4 解决TCP协议的无消息边界问题 33 2.2 利用同步TCP编写网络游戏 34 2.2.1 服务器端编程 34 2.2.2 客户端编程 49 2.3 异步TCP...

    ftp服务器开发(FTPClient FTPServer)c#

    C# (FTPClient FTPServer) sing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using ...

    c# http post get

    request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader reader = new StreamReader(response.GetResponseStream(), ...

    c# tcpServer示例程序

    2009.11.28 C# TCP服务端示例文件 环境:vs2008 c# ,xp sp3 用到TcpListener与NetworkStream

    tcp同步 网络聊天程序

    using System; using System.Collections.... NetworkStream networkStream = client.GetStream(); br = new BinaryReader(networkStream); bw = new BinaryWriter(networkStream); } public void Close() {

    c# socket 多线程

    并发多线程 //entry point of main method.... public static void Main... NetworkStream networkStream = new NetworkStream(socketForClient); StreamWriter streamWriter = new StreamWriter(networkStream);

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...

    Networkstream应用实例

    用Networkstream、tcpclient、Thread、Timmer实现的一个简单的客户端和服务器端程序,客户端定时向服务端发送数据,客户端定时接收和显示接收的数据;环境:vs 2005 ;网上下载后整理所得

    C# Socket 实现聊天

    环境:VS C# 2013 .net4.0 技术:Socket TcpClient TcpListener NetworkStream BinaryReader/BinaryWriter 服务器启用监听: 接受客户端的连接并通知其他已在线的客户端。服务器有自动检测客户端在线状态,并通知...

    C#简单窗体聊天程序(没有服务端,只有客户端)

    C#简单窗体聊天程序,主要是练习一下C#封装的TcpListener、TcpClient以及NetworkStream的使用

    C#编写简单的聊天程序 这是一篇基于Socket进行网络编程的入门文章,我对于网络编程的学习并不够深入,这篇文章是对于自己知识的一个巩固,同时希望能为初学的朋友提供一点参考。文章大体分为四个部分:程序的分析与设计、C#网络编程基础(篇外篇)、聊天程序的实现模式、程序实现。里面有代码

    NetworkStream streamToClient = remoteClient.GetStream(); byte[] buffer = new byte[BufferSize]; int bytesRead = streamToClient.Read(buffer, 0, BufferSize); Console.WriteLine("Reading data, {0} ...

    C#网络编程全面教程(c#爬虫)

    1. WebClient类 1 (1) WebClient类的主要方法 1 (2) DownloadData()方法 1 (3) OpenRead()方法 1 (4) UploadData()方法 1 ...(2) NetworkStream、TcpClient与TcpListener 5 (3) UdpClient 5 (4) SmtpClient 5

    C# Socket Winform 网络聊天

    环境:VS C# 2013 .net4.0 技术:Socket TcpClient TcpListener NetworkStream BinaryReader/BinaryWriter 服务器启用监听: 接受客户端的连接并通知其他已在线的客户端。服务器有自动检测客户端在线状态,并通知...

    C# 温故而知新:stream篇

    7.6 使用NetworkStream的注意事项和局限性 7.7 NetworkStream的构造 7.8 NetworkStream的属性 7.9 NetworkStream的方法 7.10 NetwrokStream的简单示例 7.11 创建一个客户端向服务端传输图片的小示例 版权归作者所有...

    C# Tcp简单聊天源代码

    用TCP实现的一个简单的局域网聊天工具 TcpClient newclient = new TcpClient(); newclient.Connect... NetworkStream stm = newclient.GetStream(); byte[] sendBytes = Encoding.UTF8.GetBytes(txtInfo.Text);

    用C#实现的tcp聊天程序

    用c#实现的tcp局域网聊天程序,用到了NetworkStream,tcpclient,tcplistener等这些类实现,程序中还有状态栏,可是显示当先状态! 另外还增加了对异常的处理,使程序更加健壮!!!

    C#面向对象继承-文件类

    C#面向对象编程基础文件类的PPT文件Path:对文件或目录的路径进行操作(很方便) [字符串] Directory:操作目录(文件夹),静态类 File :操作文件,静态类,对文件整体操作;拷贝,删除,剪切等 Stream:文件流,...

    c#基于Socket客户端服务端通信聊天

    至于Send和Receive,则由NetworkStream进行处理。 2.TcpClient(为 TCP 网络服务提供客户端连接) Connect:有两种方法,一种是使用无参构造方法创建TcpClient,然后调用Connect方法;另一种是使用带host与port的构造...

Global site tag (gtag.js) - Google Analytics