读《Visual C++ 编程技巧典型案例分析》――网络与通信及计算机安全与维护篇
实例19: Soket网络程序中参数对流传输性能的影响分析
学到知识: Socket程序影响传输性能的参数有5个:
套接字个数、传输延时、传输块的大小、套接字接收缓冲区和发送缓冲区。
(1) 每个线程一个套接字,适当设定线程数量可以提高传输速度。
(2) 适当设定延时时间。
(3) 适当设置传输块的大小。
(4) 适当设置发送和接受缓冲区的大小。
第(1)和(4)感觉应该是比较关键的因素,会对传输速度产生很大的影响。
实例20:多线程网络文件传输的设计与实现
一、为什么选择TCP?
如果一个应用程序需要TCP的可靠性,那么TCP就是最好的解决方案。
二、数据包的完整性
一次发送较大的数据包,接收端也不一定会一次就完全收到,而可能在接收端出发几次FD_READ事件。每次发送少量数据会影响效率,不仅因为每次对Send和Receive的调用需要至少两个上下切换,更因为进行过多的小规模接收或发送操作会收到TCP协议中Nagle算法的影响。
三、控制文件的传输过程
发送和接受文件的两端程序都应遵循一种事先约定好的协议以协调双方的行为。这种协议应该带有控制信息的特定数据包来传递,而不应夹带在传输文件数据的数据包中。
控制数据包可以携带的信息包括:“询问是否接收”、“拒绝请求”、“同意接收”、“文件接收完毕”等。
Struct tagCtrlMsg //控制数据包结构
{
Char signal; //控制数据包类型标识
Struct tagFileInfo FileInfo; //自定义文件属性结构
}
四.略
五、引入多线程技术(大文件传输存储方法)
发送端和接收端在读写文件时必须把文件共享属性设置为:CFile::shareDenyNone.这是因为在发送端会有多个线程同时读一个文件,而在客户端有两种处理方式:①各个接收线程先把收到的数据存为不同的文件,最后由监视线程把他们合并起来。②接收文件数据前,直接在磁盘中开辟一个与接收文件大小一致的一个文件,随后,接收线程分别打开这个文件,并定位到文件的某个位置,各自负责把接收到的数据直接写入目标文件。
目前比较流行的软件“迅雷”,就是应用第二种方法接收文件数据。(可以看到在迅雷下载的过程中进行中止,就可以看到文件目录中出现一个文件,它的大小已经和要下载的文件的字节数相同了。)
本文阐述的影响传输速率的相关因素:
1. 每次读文件的大小
2. 套接字个数
3. 每次发送/接收的数据块的大小
4. 传输延迟
5. Socket的缓冲区大小