使用TransmitFile函数需要注意的几点

来源:互联网 发布:linux ntp自动同步 编辑:程序博客网 时间:2024/04/28 15:03

    TransmitFile是专门用来进行文件传输的函数,它的优势在于在内核将文件句柄和套接字联系起来进行发送,避免了将文件内容读到应用层再写到内核的过程,提高了效率。函数声明如下:

BOOL TransmitFile(  SOCKET hSocket,                     HANDLE hFile,                                 DWORD nNumberOfBytesToWrite,                  DWORD nNumberOfBytesPerSend,                  LPOVERLAPPED lpOverlapped,                    LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,    DWORD dwFlags                               );
    有几点需要注意的地方:

    1、此函数的调用在非服务器的系统上最多仅允许同时存在两个。即如果在非服务器系统上有多处同时调用此函数来传输文件,那么最多会有两个同时处于传输状态,第三个和其后的所有将进入等待,”名额“空出之前,等待的函数不会发送任何数据。在服务器系统上则没有这个限制,但可以通过修改注册表来限制最大并发数。

    2、此函数一次无法传输大于2G的文件。这里的2G是一个约数,精确值为0x7fffffff,即最大的有符号整数。最简单的解释是WSAGetOverlappedResult获取传输数据大小的时候首先无法获得超过0xffffffff范围的大小,而负数返回值在一些函数如WsaRecv中有特殊含义,所以这里仅能支持2G以内的大小。

    3、打开文件时使用FILE_FLAG_SEQUENTIAL_SCAN标记可以提高文件传输效率。

    4、LPTRANSMIT_FILE_BUFFERS中可以包含发送文件前发什么、发送文件后发什么,很方便的加入自定义的协议控制内容。

原创粉丝点击