Socket开发时,Available为0,实际还有数据的问题
这段时间处理Socket通讯,比如文件传输,通常代码如下:
string filename = @"c:\abc.txt";
// 发送文件名字符串长度(测试代码,实际请传输字符串字节长度)
SendLength(socket, filename.Length);
// 发送文件名字符串
SendData(socket, filename);
// 发送文件长度和文件实际内容
SendFile(socket, filename);
接收端代码:
// 在socket的Receive方法前必须明确指明其为阻塞模式
socket.Blocking = true;
// 获取文件名长度
int msgLength = GetLength(socket);
// 获取指定长度的字符串
string filename = GetData(socket, msgLength);
if(socket.Available > 0){
// 如果还有数据,表示是文件长度和内容,保存它
GetFile(socket, @"e:\saveFile.txt");
}
实际运行时,经常出现明明传输了文件,但是Available却为0,导致文件接收失败,
进行调试,又无法重现这个问题,不调试也经常重现,尤其是2个Socket都在同一机器时,问题更明显。
后来通过在上述接收代码不断打Console.Write输出日志,终于发现,Available为0时,GetFile也能获取到后续文件数据,
估计是文件名传输完毕,文件还没发送过来时,另一端就接收完文件名,马上接收文件,导致Available为0了,做了一个最粗糙的处理,就是接收文件前休眠20毫秒,接收端代码如下:
Thread.Sleep(TimeSpan.FromMilliseconds(20));
if(socket.Available > 0){
// 如果还有数据,表示是文件长度和内容,保存它
GetFile(socket, @"e:\saveFile.txt");
}
ok,至少目前在我的生产环境未再出现上述问题了,而且通常20毫秒,大家也感觉不到,哈哈,希望你如果有更好的办法,请通知我
首发:http://beinet.cn
Socket开发时,Available为0,实际还有数据的问题的更多相关文章
- (转)Socket开发时,Available为0,实际还有数据的问题
本文转载自:http://blog.csdn.net/youbl/article/details/11067369 这段时间处理Socket通讯,比如文件传输,通常代码如下:string filena ...
- aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【把数据存到LBS云2/2】
中国的IT 需要无私分享和贡献的人,一起努力 本篇博客来自地址:http://www.cnblogs.com/AaronYang/p/3672898.html,请支持原创,未经允许不许转载 1.新建一 ...
- aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【把数据存到LBS云1/2】
如何让用户点,我们可以获得经纬度,我们就要先了解下它给我们提供的百度地图的事件 主要有两个操作事件的,绑定(addEventListener)和解绑(removeEventListener) 一些事件 ...
- 使用socket.io client 开发时兼容IE低版本的办法
使用socket.io client 开发时兼容IE低版本的办法 socket.io提供了针对各个版本浏览器的‘socket’功能的封转:websocket,长连接,流,flash什么的.给你格式化下 ...
- 快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础
上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是W ...
- IOS socket开发基础
摘要 详细介绍了iOS的socket开发,说明了tcp和udp的区别,简单说明了tcp的三次握手四次挥手,用c语言分别实现了TCPsocket和UDPsocket的客户端和服务端,本文的作用是让我们了 ...
- 第六章|网络编程-socket开发
1.计算机基础 作为应用开发程序员,我们开发的软件都是应用软件,而应用软件必须运行于操作系统之上,操作系统则运行于硬件之上,应用软件是无法直接操作硬件的,应用软件对硬件的操作必须调用操作系统的接口,由 ...
- 练习题|网络编程-socket开发
1.什么是C/S架构? C指的是client(客户端软件),S指的是Server(服务端软件),C/S架构的软件,实现服务端软件与客户端软件基于网络通信. 2.互联网协议是什么?分别介绍五层协议中每一 ...
- python 网络编程之socket开发和socketserver模块
一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...
随机推荐
- Hadoop Security Authentication Terminology --Kerberos
Hadoop Security Authentication Terminology --Kerberos What is kinit? Kinit - obtain and cache Kerbe ...
- Android学习——百度地图开发定位与显示Demo
百度地图给我们提供了很丰富的API供我们进行二次开发.百度地图的SDK与定位SDK在今年6月份进行了更新. 地图更新为3.0,定位更新为4.2.百度说:这次更新对接口有了较大部分的调整,与之前版本号不 ...
- veridata实验例(5)在更改主键列值,update操作将被分成两个语句
veridata实验例(5)更改主键列值,update操作将被分成两个语句 续接"veridata实验举例(4)验证veridata查找出updata.delete操作导致的不同步现象&qu ...
- 用AS3清空容器下所有子显示对象
容器中的子显示对象分为两类: 处于显示列表中的子显示对象.被numChildren所记录的. 由容器graphics对象绘制出来的矢量图.这个矢量图不属于Shape类型,不在容器的显示列表中,不被nu ...
- 【Oracle】ORA-01722:无效数字(控制文件最后一个字段)
原因: 每一行物理数据最后都存在一个换行符. 如果integer或者number类型的字段位于控制文件的最后,最后其实都会有CR/LF的换行符,在用sqlldr导入时会把换行符也算作那个数字的一部分, ...
- gpexpand error:Do not have enough valid segments to start the array.
gpstart error: Do not have enough valid segments to start the array. 这个时候需要检查一下shared_buffers设置改小点,就 ...
- 高质量程序设计指南C/C++语言——C++/C程序设计入门
1.在C++/C中,全局变量(extern或static)存放在程序的静态数据区中,在程序进入main()之前创建,在main()结束之后销毁,因此在我们的代码中根本没有机会初始化它们,于是语言及其实 ...
- ZOJ 3607 Lazier Salesgirl 贪心
这个题比上个题简单得多,也是超过W时间会睡着,睡着就再也不会卖了,顾客按时间顺序来的,但是可能有顾客同时到(同时到如果醒着就全卖了),并且每个人只买一块面包,也是求最大的W,使得卖出面包的平均价格最高 ...
- USACO Subset 整数划分01背包
又是去理解了一次01背包. 这道题目的意思就是给你一个N (N < 40)表示有一个集合{1,2,3,... n} 你要将它划分成相等的两个子集合,求有几种划分方式 如果N是奇数,那么显然不能由 ...
- 1.unix网络编程基础知识
接触网络编程一年多了,最近在系统的学习vnp两本书,对基础知识做一些总结,希望理解的更透彻清晰,希望能有更多的沉淀. 1.套接口地址 针对IPv4和IPv6地址族,分别定义了两种类型的套接口地址:so ...