首页 > 其他 > 详细

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

时间:2014-08-14 19:50:59      阅读:422      评论:0      收藏:0      [点我收藏+]

本文转载自:http://blog.csdn.net/youbl/article/details/11067369

这段时间处理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毫秒,大家也感觉不到,哈哈,希望你如果有更好的办法,请通知我

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

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

原文:http://www.cnblogs.com/wpcnblog/p/3912826.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!