使用TransmitFile函数需要注意的几点
2013-06-21 17:46
302 查看
TransmitFile是专门用来进行文件传输的函数,它的优势在于在内核将文件句柄和套接字联系起来进行发送,避免了将文件内容读到应用层再写到内核的过程,提高了效率。函数声明如下:
有几点需要注意的地方:
1、此函数的调用在非服务器的系统上最多仅允许同时存在两个。即如果在非服务器系统上有多处同时调用此函数来传输文件,那么最多会有两个同时处于传输状态,第三个和其后的所有将进入等待,”名额“空出之前,等待的函数不会发送任何数据。在服务器系统上则没有这个限制,但可以通过修改注册表来限制最大并发数。
2、此函数一次无法传输大于2G的文件。这里的2G是一个约数,精确值为0x7fffffff,即最大的有符号整数。最简单的解释是WSAGetOverlappedResult获取传输数据大小的时候首先无法获得超过0xffffffff范围的大小,而负数返回值在一些函数如WsaRecv中有特殊含义,所以这里仅能支持2G以内的大小。
3、打开文件时使用FILE_FLAG_SEQUENTIAL_SCAN标记可以提高文件传输效率。
4、LPTRANSMIT_FILE_BUFFERS中可以包含发送文件前发什么、发送文件后发什么,很方便的加入自定义的协议控制内容。
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中可以包含发送文件前发什么、发送文件后发什么,很方便的加入自定义的协议控制内容。
相关文章推荐
- 使用TransmitFile函数需要注意的几点
- Java使用HashMap进行遍历时候需要注意的几点
- 使用SqlDataAdapter时,需要注意的几点
- foreach语句使用需要注意的几点
- 调试使用了函数模块的程序时需要注意的一个小问题
- 使用execvp()函数需要注意的两点
- 使用SqlDataAdapter时,需要注意的几点
- C++使用localtime函数需要注意的地方
- 使用execvp()函数需要注意的两点
- 总结在使用JPA时需要注意的几点
- C++使用boost python开发后发布程序需要注意的几点
- C/C++库中使用time.h中函数需要注意
- php in_array 函数使用说明与in_array需要注意的地方说明
- C++使用localtime函数需要注意的地方
- 使用OpenGL的glBindTexture()函数需要注意
- 使用php apc模块需要注意的几点
- 使用NOSQL的MongoDB建立索引时需要注意的几点建议和Explain优化分析
- php的crc32函数使用时需要注意的问题(不然就是坑)
- 使用innerHTML时需要注意的几点问题
- 使用switch语句需要注意的几点