TransmitFile

TransmitFile 是一个扩展的 API,它允许在套接字连接上发送一个打开的文件。这使得应用程序可以避免亲自打开文件,重复地在文件执行读入操作,再将读入的那块数据写入套接字。相反,已打开的文件的句柄是各套接字连接一起给出的,在套接字上,文件数据的读入和发送都在核心模式下进行。这就避免了亲自执行文件读入时必须的多重内核变换。

函数原型:BOOL   PASCAL FAR   

TransmitFile(

 IN SOCKET hSocket,

IN HANDLE hFile,

IN DWORD nNumberOfBytesToWrite,

IN DWORD nNumberOfBytesPerSend,

IN LPOVERLAPPED lpOverlapped,

IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,

IN DWORD dwReserved

);

第一个参数是连接套接字。

hFile 参数是一个打开文件的句柄,这个参数可以是NULL,此时将传输 lpTransmitBuffer。当然,使用TransmitFile 来发送仅用于存储的缓冲区没有什么意义。

nNumberOfBytesToWrite 参数是从文件发送的字节数,取值为零时表示发送整个文件。

nNumberOfBytesPerSend 参数指明每个发送操作中所发送的每个数据块的大小,如果将其指定为零,系统就使用默认的发送大小。Windows NT 工作站上默认的发送大小是 4K,南昌在Windows服务器上是64K。

lpOVERLAPPED 结构可有可无,但得注意,如果忽略掉这个结构,文件传输将从当前文件指针的位置开始。

lpTransmitBuffers 参数是一个 TRANSMIT_FILE_BUFFERS 结构,包含存储缓冲区,这个存储缓冲区将在文件被传输之前或之后传输。lpTransmitBuffers 参数是一个可选参数。

最后一个参数是可选标志,它将影响文件操作的行为。

 

使用TransmitFile进行文件发送的时候,发现文件大于2G的时候,发送会失败。仔细的研究了下,原来传输的的数目是用DWORD进行表示的,2G它已经表示不了了。这个时候需要判断文件是否大于2G,大于2G每次最多可以传输2G-1,传入2G会导致函数失败,并提示无效参数。第二次传输的继续判断剩余是否大于2G。传输的时候修改下文件偏移进行传输就可以了。文件偏移在OVERLAPPED 里面有,同样有低位偏移和高位偏移。将文件句柄,文件大小和文件传输数目也随OVERLAPPED 结构返回。这样就能继续发送完了。 

例子程序:http://115.com/file/dw2qf86a

posted @ 2012-11-29 08:06  广拓小程序  阅读(1406)  评论(0编辑  收藏  举报