尝试做了一个利用WINSOCK控件的自动分包发送机制的东东(VB6.0)

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

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

来看看服务器端界面:



客户端界面:



整个工程打包下载:

下载文件 点击下载此文件

*************************************************
2009-08-12更新
增加了客户端的文件夹上传功能.
*************************************************


评论: 21 | 引用: 0 | 查看次数: 6328
WSASD
WSASD[2011-12-27 08:10 PM | ]
实际上可以不需要使用 CopyMemory 和 DoEvents,尤其是后者完全没必要。

本人用VB6写过 网络快递
雨夜飞翔
雨夜飞翔[2011-06-30 12:13 PM | ]
在找发送文件的例程,用上了!非常感谢~

只是感觉模块太多了,我喜欢合并成一个.个人习惯吧...
kip
kip[2011-06-17 09:54 AM | ]
多谢 老马
QQ77484307
QQ77484307[2010-10-25 04:56 PM | ]
老马同志:
我是VB新手,能否改一下你的程序,从服务端给多个客户端传递文件(含文件夹),烦给出源代码实例!
我给50元人民币怎么样呀!改好后加我QQ77484307!急用!!

回复来自 admin 的评论 admin 于 2010-10-26 06:02 PM 回复
晕,文件夹的发送,就是遍历文件夹得到所有文件,再一一发送啊.

客户端有代码,直接照搬不就OK了么- -!
QQ77484307
QQ77484307[2010-10-25 01:00 PM | ]
老马同志!
你加我QQ吗?请教和交流VB编程!
QQ77484307
QQ77484307[2010-10-17 07:12 AM | ]
老马同志:
我是VB新手,能否改一下你的程序,从服务端给多个客户端传递文件(含文件夹),烦给出源代码实例!
回复来自 admin 的评论 admin 于 2010-10-17 03:16 PM 回复
这个很抱歉,实现此功能的代码已经在我这个例子里面包含了,你只需要消化吸收即可.

如果我什么都写好了给你,这与我帮你写有什么区别呢?你什么都不会学到.
boyso
boyso[2010-04-28 12:06 AM | ]
感谢马哥的分享,让我茅塞顿开哈~~~
回复来自 admin 的评论 admin 于 2010-04-28 11:36 AM 回复
:)
admin
admin[2009-12-17 03:33 PM | ]
引用来自 xxxcyy 引用来自 xxxcyy
文件太大就传不了,byte数组不能定义的太大

一次只需要准备几秒的数据即可,比如网络带宽为2M,则每秒字节为256Kbyte理论,则准备1M大小的数据,至少也要传送4秒.

我这个例子只是证明一下WINSOCK控件在底层的自动分包机制,实际还是要自己分包的,不能比我还懒吧
xxxcyy
xxxcyy[2009-12-17 08:59 AM | ]
文件太大就传不了,byte数组不能定义的太大
xinshou
xinshou[2009-11-14 10:42 PM | ]
老马是谁啊?看样子很有人气啊。
李征宇
李征宇[2009-09-17 11:44 PM | ]
支持老马
admin
admin[2009-08-26 03:04 PM | ]
:)
superfans
superfans[2009-08-25 07:14 AM | ]
原来这是老马的博客。来踩踩
admin
admin[2009-07-23 03:53 AM | ]
引用来自 小齐 引用来自 小齐
您好博主
我遇到一个难题 希望您能帮忙看一下

我使用以下语句来对联网的每个用户发送信息

For i = 1 To tcpIndex - 1
If tcpServer(i).State = 7 Then
tcpServer(i).SendData (msg)
DoEvents
Else
'MsgBox "nono"
End If
Next

问题在于:超过6台机器后 延迟就非常的明显 怎样才能实现同步呢??我这边最多可能有50-100台机器。

期待博主的回复。

不知道你的代码结构是什么样的.

如果你的代码里面有心跳包,就可以在每次心跳包到达时检查数据是否有更新------如果相对当前客户端的数据来说有更新,则向客户端发送数据.

另外,你试着把DoEvents放到循环外看看.
小齐
小齐[2009-07-23 01:09 AM | ]
您好博主
我遇到一个难题 希望您能帮忙看一下

我使用以下语句来对联网的每个用户发送信息

For i = 1 To tcpIndex - 1
If tcpServer(i).State = 7 Then
tcpServer(i).SendData (msg)
DoEvents
Else
'MsgBox "nono"
End If
Next

问题在于:超过6台机器后 延迟就非常的明显 怎样才能实现同步呢??我这边最多可能有50-100台机器。

期待博主的回复。
holiwood
holiwood[2009-07-21 09:14 PM | ]
这个程序我试了觉得相当不错,学习了!
我现在有个问题请赐教。就是怎样把接收端改成直送计算机并口?先谢谢了!
67567
67567[2009-07-17 11:24 AM | ]
有个传输软件 网络快递,就是用vb6+winsock写的,支持缓冲区
admin
admin[2009-02-27 01:45 AM | ]
由于网速原因占了一点点上风.....详细情况参见以下帖子:

http://topic.csdn.net/u/20090217/23/3c170138-c61f-4294-b081-ec528d2d1b56.html
yyyy
yyyy[2009-02-26 05:47 PM | ]
老马和VBGOOD的网友打CS赢了没?
开心海
开心海[2008-07-29 09:17 PM | ]
有劳老马了!
灯雪
灯雪[2008-07-29 05:35 PM | ]
不错不错。。继续改进,超越IPmessager