您的位置:首页 > 其它

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

2013-06-21 17:46 302 查看
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中可以包含发送文件前发什么、发送文件后发什么,很方便的加入自定义的协议控制内容。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: