之前在开心海的帖子里(
点击访问 )看到有说这个分包机制,以及接收时的处理方式等问题的讨论,觉得逻辑上应该有懒可偷,于是就有了本文.
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
欢迎大家讨论一下,这也是个比较实际的问题.