网络编程分为阻塞和非阻塞两种方式,如果选择了阻塞方式进行编程,控制不好很容易导致程序死掉。

  下面这段代码中:

        ...     TcpListener tcpListener = null;TcpClient tcpClient = null;NetworkStream networkStream = null;.../// <summary>/// 接收线程/// </summary>private void receive(){while (true){Thread.Sleep(TimeSpan.FromSeconds(1));this.AddTextToCommStateList(DateTime.Now.ToString() + "\t等待连接...");tcpClient = tcpListener.AcceptTcpClient();Thread.Sleep(TimeSpan.FromSeconds(1));this.AddTextToCommStateList(DateTime.Now.ToString() + "\t已连接");networkStream = tcpClient.GetStream();// 设置读取超时时间为10秒networkStream.ReadTimeout = 10000;// 设置写入超时时间为10秒networkStream.WriteTimeout = 10000;byte[] recvBuff = new byte[8192];int readBytes = 0;while (tcpClient != null){try{this.AddTextToCommStateList(DateTime.Now.ToString() + "\t开始读取");readBytes = networkStream.Read(recvBuff, 0, recvBuff.Length);this.AddTextToCommStateList(DateTime.Now.ToString() + "\t读取完毕");}catch (IOException ex){this.AddTextToCommStateList(DateTime.Now.ToString() + "\t接收错误");this.AddTextToCommStateList(DateTime.Now.ToString() + "\t错误信息:" + ex.Message);break;}...

  如果去掉networkStream.ReadTimeout = 10000;和networkStream.WriteTimeout = 10000;两行,程序就有可能在

  readBytes = networkStream.Read(recvBuff, 0, recvBuff.Length);处死掉(笔者在调试到此时将网线拔掉,发现程序就会死在这里,即使网络恢复了程序也不会恢复)。

  查看MSDN中关于NetworkStream类的帮助信息,发现ReadTimeout和WriteTimeout属性的默认值都是Infinite(无限),即永不超时,所以networkStream.Read在读不到数时就永远不会返回。

转载于:https://www.cnblogs.com/onedime/archive/2013/01/14/2859834.html

解决C#网络通信编程的阻塞问题相关推荐

  1. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

    首先声明一下,刚开始学习Java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所以...呵呵..你懂得,昨天又仔细的学习了一遍,感觉其实java网络编程也没想象的那么难,不信,咱一起看看.. ...

  2. Java网络编程 ---- TCP 网络通信编程

    视频:[零基础 快速学Java]韩顺平 零基础30天学会Java 文章目录 1. Socket 2. TCP 网络通信编程 3. 应用案例 1(使用字节流) 4. 应用案例 2(使用字节流) 5. 应 ...

  3. php-cgi和php-fpm,Windows环境下解决Nginx+php并发访问阻塞问题。

    php-cgi 是运行php, php-fpm是守护php-cgi进程 nginx配置目录运行php         location  ~ \.php$         {              ...

  4. 成功解决:利用编程向数据库插入一条记录,而从数据库中查不到该条记录

    成功解决:利用编程向数据库插入一条记录,而从数据库中查不到该条记录 目录 解决问题 解决方法 1.首先查看是否有conn.commit() 2.继续判断 解决问题 利用编程向数据库插入一条记录,而从数 ...

  5. Java并发编程之阻塞队列

    Java并发编程之阻塞队列 目录 阻塞队列概述 为什么用?有什么好处? BlockingQueue的核心方法 SynchronousQueue的用法 用在哪里 1. 阻塞队列概述 阻塞队列,顾名思义, ...

  6. Qt:Qt实现Winsock网络编程—非阻塞模式下的简单远程控制的开发(WSAAsyncSelect)

    Qt实现Winsock网络编程-非阻塞模式下的简单远程控制的开发(WSAAsyncSelect) 前言 这边博客应该是 Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 的姐妹篇,上 ...

  7. 14种模式解决面试算法编程题(PART I)

    万万没想到,暑假还没开始,有些公司的秋招提前批已经来了-很慌-数据结构和算法题可以说是秋招笔试面试必考的内容,如果你还不够熟练(just like me),那就要从现在开始疯狂刷题了啊朋友们. 附上我 ...

  8. 完美解决HALCON C#编程目标平台冲突问题

    完美解决HALCON C#编程目标平台冲突问题 参考文章: (1)完美解决HALCON C#编程目标平台冲突问题 (2)https://www.cnblogs.com/qqhfeng/p/664915 ...

  9. 通过Teardrop学习网络通信编程

    目录 一.实验相关概念 (一)原始套接字含义 (二)Teardrop攻击 二.步骤 1.配置VMware 2.编写Teardrop.c程序 3.编译运行 4.抓包分析 三.其它 实验目的:学习&quo ...

  10. cocos网络通信php,Cocos2D-X服务器的网络通信编程

    我们在学习Cocos2d-x的时候经常会需要配置服务端与客户端的网络通讯,本篇教程将作为一个Cocos2D-X的网络实例,来为大家讲解如何实现Cocos2D-X服务器的网络通信编程. 这里采用Apac ...

最新文章

  1. C#设计模式--简单工厂模式
  2. 小米故事:凭什么把MIUI用户做到1亿 | PMcaff-干货
  3. [IDEA] 异常 Configuration is still incorrect. Do you want to edit it again? Error: module not specifie
  4. [转] 没人把程序员当回事儿
  5. 重新解读DDD领域驱动设计(一)
  6. Selenium学习(2) 元素定位
  7. 计算机应用基础模块2客观题答案 文档,计算机应用基础网上形考答案模块2Word2010文字处理系统客观题答案.doc...
  8. Windows 7硬件驱动搜索更加智能、精确
  9. web worker 的传值方式以及耗时对比
  10. 漂白android软件,原本图片漂白软件
  11. 如何申请免费的企业邮箱
  12. 浅谈C中的wprintf和宽字符显示
  13. 【日志分析】Web日志分析
  14. (最新最详细)eclipse的preferences下没有Android首选项?
  15. 2014区域赛北京站总结
  16. JavaScript之JSON
  17. 负数的二进制与十进制转化
  18. 【无标题】java多线程分批同步数据设计与实现(转载)
  19. 隐藏键盘_吊打苹果官方键盘?ipad第三方磁吸可拆卸键盘评测
  20. 内存或磁盘空间不足,Microsoft Excel无法再次打开或保存任何文档。

热门文章

  1. tomcat启动内存设置以及字符集设置
  2. 解决:The Apache Tomcat Native library
  3. 学 Win32 汇编[13]: 定义符号常量(=、EQU、TEXTEQU)
  4. 按值传递时 php必须复制值,PHP开发笔试题及答案(一)
  5. oracle 外部os授权,外部OS认证的过程
  6. wpf 切换搜狗输入法英文_搜狗输入法使用技巧整理,建议保存收藏
  7. java jlabel位置_Java Swing – JLabel位置
  8. go -context
  9. Android开机设置自启动
  10. android 缩放组件,Android控件之ZoomControls缩放控件