解决C#网络通信编程的阻塞问题
网络编程分为阻塞和非阻塞两种方式,如果选择了阻塞方式进行编程,控制不好很容易导致程序死掉。
下面这段代码中:
... 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#网络通信编程的阻塞问题相关推荐
- Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
首先声明一下,刚开始学习Java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所以...呵呵..你懂得,昨天又仔细的学习了一遍,感觉其实java网络编程也没想象的那么难,不信,咱一起看看.. ...
- Java网络编程 ---- TCP 网络通信编程
视频:[零基础 快速学Java]韩顺平 零基础30天学会Java 文章目录 1. Socket 2. TCP 网络通信编程 3. 应用案例 1(使用字节流) 4. 应用案例 2(使用字节流) 5. 应 ...
- php-cgi和php-fpm,Windows环境下解决Nginx+php并发访问阻塞问题。
php-cgi 是运行php, php-fpm是守护php-cgi进程 nginx配置目录运行php location ~ \.php$ { ...
- 成功解决:利用编程向数据库插入一条记录,而从数据库中查不到该条记录
成功解决:利用编程向数据库插入一条记录,而从数据库中查不到该条记录 目录 解决问题 解决方法 1.首先查看是否有conn.commit() 2.继续判断 解决问题 利用编程向数据库插入一条记录,而从数 ...
- Java并发编程之阻塞队列
Java并发编程之阻塞队列 目录 阻塞队列概述 为什么用?有什么好处? BlockingQueue的核心方法 SynchronousQueue的用法 用在哪里 1. 阻塞队列概述 阻塞队列,顾名思义, ...
- Qt:Qt实现Winsock网络编程—非阻塞模式下的简单远程控制的开发(WSAAsyncSelect)
Qt实现Winsock网络编程-非阻塞模式下的简单远程控制的开发(WSAAsyncSelect) 前言 这边博客应该是 Qt实现Winsock网络编程-TCP服务端和客户端通信(多线程) 的姐妹篇,上 ...
- 14种模式解决面试算法编程题(PART I)
万万没想到,暑假还没开始,有些公司的秋招提前批已经来了-很慌-数据结构和算法题可以说是秋招笔试面试必考的内容,如果你还不够熟练(just like me),那就要从现在开始疯狂刷题了啊朋友们. 附上我 ...
- 完美解决HALCON C#编程目标平台冲突问题
完美解决HALCON C#编程目标平台冲突问题 参考文章: (1)完美解决HALCON C#编程目标平台冲突问题 (2)https://www.cnblogs.com/qqhfeng/p/664915 ...
- 通过Teardrop学习网络通信编程
目录 一.实验相关概念 (一)原始套接字含义 (二)Teardrop攻击 二.步骤 1.配置VMware 2.编写Teardrop.c程序 3.编译运行 4.抓包分析 三.其它 实验目的:学习&quo ...
- cocos网络通信php,Cocos2D-X服务器的网络通信编程
我们在学习Cocos2d-x的时候经常会需要配置服务端与客户端的网络通讯,本篇教程将作为一个Cocos2D-X的网络实例,来为大家讲解如何实现Cocos2D-X服务器的网络通信编程. 这里采用Apac ...
最新文章
- C#设计模式--简单工厂模式
- 小米故事:凭什么把MIUI用户做到1亿 | PMcaff-干货
- [IDEA] 异常 Configuration is still incorrect. Do you want to edit it again? Error: module not specifie
- [转] 没人把程序员当回事儿
- 重新解读DDD领域驱动设计(一)
- Selenium学习(2) 元素定位
- 计算机应用基础模块2客观题答案 文档,计算机应用基础网上形考答案模块2Word2010文字处理系统客观题答案.doc...
- Windows 7硬件驱动搜索更加智能、精确
- web worker 的传值方式以及耗时对比
- 漂白android软件,原本图片漂白软件
- 如何申请免费的企业邮箱
- 浅谈C中的wprintf和宽字符显示
- 【日志分析】Web日志分析
- (最新最详细)eclipse的preferences下没有Android首选项?
- 2014区域赛北京站总结
- JavaScript之JSON
- 负数的二进制与十进制转化
- 【无标题】java多线程分批同步数据设计与实现(转载)
- 隐藏键盘_吊打苹果官方键盘?ipad第三方磁吸可拆卸键盘评测
- 内存或磁盘空间不足,Microsoft Excel无法再次打开或保存任何文档。
热门文章
- tomcat启动内存设置以及字符集设置
- 解决:The Apache Tomcat Native library
- 学 Win32 汇编[13]: 定义符号常量(=、EQU、TEXTEQU)
- 按值传递时 php必须复制值,PHP开发笔试题及答案(一)
- oracle 外部os授权,外部OS认证的过程
- wpf 切换搜狗输入法英文_搜狗输入法使用技巧整理,建议保存收藏
- java jlabel位置_Java Swing – JLabel位置
- go -context
- Android开机设置自启动
- android 缩放组件,Android控件之ZoomControls缩放控件