这段时间处理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,实际还有数据的问题的更多相关文章

  1. (转)Socket开发时,Available为0,实际还有数据的问题

    本文转载自:http://blog.csdn.net/youbl/article/details/11067369 这段时间处理Socket通讯,比如文件传输,通常代码如下:string filena ...

  2. aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【把数据存到LBS云2/2】

    中国的IT 需要无私分享和贡献的人,一起努力 本篇博客来自地址:http://www.cnblogs.com/AaronYang/p/3672898.html,请支持原创,未经允许不许转载 1.新建一 ...

  3. aaronyang的百度地图API之LBS云与.NET开发 Javascript API 2.0【把数据存到LBS云1/2】

    如何让用户点,我们可以获得经纬度,我们就要先了解下它给我们提供的百度地图的事件 主要有两个操作事件的,绑定(addEventListener)和解绑(removeEventListener) 一些事件 ...

  4. 使用socket.io client 开发时兼容IE低版本的办法

    使用socket.io client 开发时兼容IE低版本的办法 socket.io提供了针对各个版本浏览器的‘socket’功能的封转:websocket,长连接,流,flash什么的.给你格式化下 ...

  5. 快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础

    上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是W ...

  6. IOS socket开发基础

    摘要 详细介绍了iOS的socket开发,说明了tcp和udp的区别,简单说明了tcp的三次握手四次挥手,用c语言分别实现了TCPsocket和UDPsocket的客户端和服务端,本文的作用是让我们了 ...

  7. 第六章|网络编程-socket开发

    1.计算机基础 作为应用开发程序员,我们开发的软件都是应用软件,而应用软件必须运行于操作系统之上,操作系统则运行于硬件之上,应用软件是无法直接操作硬件的,应用软件对硬件的操作必须调用操作系统的接口,由 ...

  8. 练习题|网络编程-socket开发

    1.什么是C/S架构? C指的是client(客户端软件),S指的是Server(服务端软件),C/S架构的软件,实现服务端软件与客户端软件基于网络通信. 2.互联网协议是什么?分别介绍五层协议中每一 ...

  9. python 网络编程之socket开发和socketserver模块

    一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务端为你提供视频 ...

随机推荐

  1. iOS中的图像处理(二)——卷积运算

    关于图像处理中的卷积运算,这里有两份简明扼要的介绍:文一,文二. 其中,可能的一种卷积运算代码如下: - (UIImage*)applyConvolution:(NSArray*)kernel { C ...

  2. JQ 一些基本方法

    1.判断复选框是否有选中,bischecked 返回 ture 或 false var bischecked = $('[name=uid]').is(':checked'); 2.查看当前元素是父元 ...

  3. IOS7 适配以及向下兼容问题

    1.所有的UIViewController加如下方法.     - (void) viewDidLayoutSubviews {         if ([[[UIDevice currentDevi ...

  4. [HDU 1016]--Prime Ring Problem(回溯)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016 Prime Ring Problem Time Limit: 4000/2000 MS (Jav ...

  5. [HDU 1428]--漫步校园(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1428 漫步校园 Time Limit: 2000/1000 MS (Java/Others)    M ...

  6. Android存储之SQLiteDatbase

    SQLiteDatabase的方式会生成一个数据库文件,每个应用最多只对应一个数据库文件,即.db文件. 可以使用很多第三方工具进行打开,查看数据库里的内容. 昨晚试了好几种工具,如navicat,s ...

  7. Linux/Mac OS 下 批量提交 新增文件到SVN 服务器

    命令行下操作svn没有使用界面形式的TortoiseSVN直观,但是不管怎样,命令行下操作svn还是有它的有点,如果你碰到一次需要svn add许多个文件怎么办?下面的命令可以帮助你解决这个问题 一次 ...

  8. CodeForces 519B A and B and Compilation Errors【模拟】

    题目意思还是蛮简单的,看 输入数据输出数据还是比较明显的 我用排序来写还是可以AC的 //#pragma comment(linker, "/STACK:16777216") // ...

  9. A valid provisioning profile for this executable was not found.

  10. Delphi_MemoryModule — load DLL from memory. Also includes hooking utilities.

    https://github.com/Fr0sT-Brutal/Delphi_MemoryModule