5.1 文件传输
使用Winsock 2.0的
TransmitFile
函数传输文件
。
TransmitFile
函数在连接的套接字句柄上传输文件数据。此函数使用操作系统的缓冲管理机制接收文件数据,在套接字上提供高性能的文件传输。在异步文件传输上有以下几个重要方面:
l
除非
TransmitFile
函数返回,否则不能再对套接字执行 发送 或 写入 操作,不然会破坏文件的传输。在执行
PrepareSendFile(..)
函数后,所有对
ASend
函数的调用都是不允许的。
l
由于系统是连续读文件数据,打开文件句柄的
FILE_FLAG_SEQUENTIAL_SCAN
特性可以提高缓存性能。
l
在发送文件(
TF_USE_KERNEL_APC
)时,我们使用内核的异步程序调用。
TF_USE_KERNEL_APC
的使用可以带来明显的性能提升。很可能(尽管不一定),带有
TransmitFile
的线程的上下文环境的初始化会有沉重的计算负担;这种情况下可以防止反复执行APC(异步程序调用)。
文件传输的顺序如下:服务器通过调用
PrepareSendFile(..)
函数初始化文件传输。客户端接收到文件信息时,通过调用
PrepareReceiveFile(..)
函数准备接收,并且给服务器发送一个包来开始文件传输。在服务器收到包后,它调用使用高性能的
TransmitFile
函数的
StartSendFile(..)
函数传输指定的文件。
6 源代码例子
提供的源代码是一个模拟客户端/服务器的例子,它也提供了文件传输功能。在源码中,从类