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

    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中可以包含发送文件前发什么、发送文件后发什么,很方便的加入自定义的协议控制内容。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值