• 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

  • 相关阅读:
    js中setTimeout、setInterval、 clearInterval方法简介
    分享一个VS2008漂亮的黑色主题
    最简单的设计模式
    记一次查数据的需求
    Oracle常用存储过程写法
    关于域名解析
    使用PHP打造QQ空间神奇图片
    自制小工具含源码——SPTC上海交通卡余额查询
    自制小工具含源码——博客园图床ImageBed
    不可不知的mysql 常用技巧总结
  • 原文地址:https://www.cnblogs.com/fujinliang/p/2793943.html
Copyright © 2020-2023  润新知