关于局域网文件传输的尝试(偷懒方案,嘿嘿)

嗷嗷叫的老马 2008-07-29 05:38:16
之前在开心海的帖子里( 点击访问 )看到有说这个分包机制,以及接收时的处理方式等问题的讨论,觉得逻辑上应该有懒可偷,于是就有了本文.

VB6企业版提供的WINSOCK控件本身貌似就有自动分包发送的机制-----SendData方法可以传入一个字节数组.

而SendData方法是异步的,那么传入的字节数组是怎么发送的呢?不可能是一次整个发送.

因此我猜想WINSOCK控件里面完成了如下的工作(TCP模式,UDP不知道,没试过,懒得试了....):

一,分包;

二,根据网络状态协商最佳封包大小;

三,保证发送数据的正确性.

于是就写了个简单的测试代码,看看是否与我的猜想差不多.

服务器端按多客户端的结构写的,接收到的数据按开心海的方案,分成两种处理方法.

一是直接在内存里用CopyMemory追加,接收完成后再保存至硬盘;

二是开始接收文件数据时就向硬盘保存.

最终测试,发现第二种方法在性能上要优得多.

虽然整个接收过程中代码是不断地使用PUT语句向硬盘里写数据,但是文件系统会自动进行缓冲,因此整个过程硬盘只闪了几次.

我最终的测试结果如下:

使用约44M的RAR文件(陈辉机器里找的一个什么安装包,不管它...),在陈辉机器上运行客户端,在我机器上运行服务器端,并启动服务.

网络环境是100M局域网,服务器端是INTEL双核本本+2003SP2,客户端是AMD双核台机+XPSP2,使用对联线联机.

传送过程中,峰值速度约45Mb/S,稳定速度约40Mb/S;换算为MB/S就分别约为5.6MB/S与5MB/S

100M局域网理论最高是12.5MB/S,而测试WINDOWS的文件复制,可达10MB/S(80Mb/S),不知道怎么搞的...

这里面还有个问题,就是传输过程中CPU占用严重,达到了20%到40%左右,在单核机器上应该就是40%到 80%了吧......

不过看来对于WINSOCK的猜想是正确的......因此对于一般局域网内小数据量传输,直接使用WINSOCK的机制就可以偷不少的懒了....HOHO

来看看服务器端界面:



客户端界面:



完整工程打包下载:

http://www.m5home.com/blog/article.asp?id=169

欢迎大家讨论一下,这也是个比较实际的问题.
...全文
1877 77 打赏 收藏 转发到动态 举报
写回复
用AI写文章
77 条回复
切换为时间正序
请发表友善的回复…
发表回复
EIT王子 2011-08-13
  • 打赏
  • 举报
回复
都是挂牌的专家啊。。。好利害哦
码之魂 2009-03-06
  • 打赏
  • 举报
回复
N年前网吧内网对比更新速度就达到了8M左右(百兆环境)
F8写的迅闪内核3.0
然后被现在的xs.hintsoft.com.cn收购。。。。
那是都是共享传输,现在新迅闪改为TCP传输,比原来更快。。。。
ouxianzhi520 2009-03-04
  • 打赏
  • 举报
回复
想学好VB还是得下苦功夫呀
熊孩子开学喽 2008-09-08
  • 打赏
  • 举报
回复
看到后面就知道完了,彻底成了一水贴了.
嗷嗷叫的老马 2008-09-08
  • 打赏
  • 举报
回复


还是结了吧

毕竟在VB里扔个控件就能超简单地达到不错的性能,还算可以了

大家偶尔轻松下也没啥:)
僵哥 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 71 楼 myjian 的回复:]
引用 70 楼 zzyong00 的回复:
引用 65 楼 myjian 的回复:
引用 64 楼 liangCK 的回复:
老马发技术帖?..

我水了它..


我阉了你

不用


干嘛不用......你以为他是MM呀?

还是.....已经被人阉过了?
[/Quote]
因为有人希望留住...
嗷嗷叫的老马 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 70 楼 zzyong00 的回复:]
引用 65 楼 myjian 的回复:
引用 64 楼 liangCK 的回复:
老马发技术帖?..

我水了它..


我阉了你

不用
[/Quote]

干嘛不用......你以为他是MM呀?

还是.....已经被人阉过了?
zzyong00 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 65 楼 myjian 的回复:]
引用 64 楼 liangCK 的回复:
老马发技术帖?..

我水了它..


我阉了你
[/Quote]
不用
嗷嗷叫的老马 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 67 楼 zzyong00 的回复:]
人家说,不用了
[/Quote]

什么不用了?
嗷嗷叫的老马 2008-09-07
  • 打赏
  • 举报
回复
从某种程度来说,VB高度封装化的背后还是相当复杂的

只是不明白的人会觉得VB相当简单

就像全自动电饭锅与普通的锅那样

虽然选择少了,使用简单了,但是并不一定就是简单的东西
zzyong00 2008-09-07
  • 打赏
  • 举报
回复
人家说,不用了
僵哥 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 myjian 的回复:]
关于VB6.0的多线程,我记得MSDN里有说VB6.0里面的线程模型是一种"单元"线程模型,就是说是类似自动将线程数据本地化的一种机制.

这种机制有利于基于COM的VB6.0的工作方式.

而对于VB6.0来说,使用ActiveX服务器是提供此种形式多线程的具体实现.

因此我也照着MSDN里的例子写了测试代码,确实是实现了多线程工作(详细内容请参考:http://www.m5home.com/blog/article.asp?id=54)

不知道wwwllg对于MSDN里的这种"多线程"说法有没有不同的见解呢?[/Quote]
wwwllg是研究VC的.
嗷嗷叫的老马 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 64 楼 liangCK 的回复:]
老马发技术帖?..

我水了它..
[/Quote]

我阉了你
liangCK 2008-09-07
  • 打赏
  • 举报
回复
老马发技术帖?..

我水了它..
ttjacky 2008-09-07
  • 打赏
  • 举报
回复
厉害,过来拜读一下
嗷嗷叫的老马 2008-09-07
  • 打赏
  • 举报
回复
关于VB6.0的多线程,我记得MSDN里有说VB6.0里面的线程模型是一种"单元"线程模型,就是说是类似自动将线程数据本地化的一种机制.

这种机制有利于基于COM的VB6.0的工作方式.

而对于VB6.0来说,使用ActiveX服务器是提供此种形式多线程的具体实现.

因此我也照着MSDN里的例子写了测试代码,确实是实现了多线程工作(详细内容请参考:http://www.m5home.com/blog/article.asp?id=54)

不知道wwwllg对于MSDN里的这种"多线程"说法有没有不同的见解呢?
僵哥 2008-09-07
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 wwwllg 的回复:]
我写了两个,一个tcp,一个Udp的.udp的可以达到10m双向的
想拿去测试,联系我。
[/Quote]
但是你可以说你这不是随便写出来的,不是么?

[Quote=引用 60 楼 wwwllg 的回复:]
有本质区别。vb是单线程的,不管你如何设计api,不能发挥多线程的优势。
[/Quote]
没有任何理由说明VB就是单线程的,仅仅只是VB在实现多线程时会受到更多的局限.
UDX协议 2008-09-07
  • 打赏
  • 举报
回复
有本质区别。vb是单线程的,不管你如何设计api,不能发挥多线程的优势。
嗷嗷叫的老马 2008-09-06
  • 打赏
  • 举报
回复
这么说来,如果在VB里面也使用API来自己完成细节,只要注意VB的开销,那不也差不多?

毕竟都是调用API嘛.....

不过代码量会不会比使用其它在这方面有强项的工具更多呢?
嗷嗷叫的老马 2008-09-05
  • 打赏
  • 举报
回复
嗯,这帖子应该要结了......

明天来结......

不知道开心海最近干嘛去了

前天貌似还在群里狂叫人帮他恢复U盘上众多的视频文件...........咳咳........
加载更多回复(57)

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧