用TransmitFile传输文件,怎么知道传输进度?

wangzejing20 2008-09-28 06:02:30
我是发送方。用得是个土办法,以4KB发送,然后计算。寻求更好的办法,请高手赐教。
类似回调函数之类的。

invoke CreateFile,offset szFile2,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
mov @hFile,eax
invoke GetLastError
invoke GetFileSize, @hFile,NULL
;*******************
;ebx是剩余发送的字节
;esi文件指针(可以去除)
;edi是每次发送的字节数
;
;*******************
mov ebx,eax
xor esi,esi
mov edi,4096
.while TRUE
.if ebx < edi
mov edi,ebx
.endif
invoke SetFilePointer,@hFile,esi,0,FILE_BEGIN
invoke TransmitFile,hSocket,@hFile,edi,edi,0,0,0
add esi,edi
sub ebx,edi
.break .if ebx == 0
.endw
invoke WSAGetLastError
invoke CloseHandle,@hFile
...全文
326 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuiheng 2011-04-19
  • 打赏
  • 举报
回复
用TransmitFile()发送文件, 文件发送成功.

但在发送过程中,另起线程,调用WSAGetOverlappedResult(参数正确);
返回是0; 提示:重叠io事件不在信号状态中.
cuiheng 2011-04-19
  • 打赏
  • 举报
回复

我看了你的帖子,用了WSAGetOverlappedResult();返回是0; 提示:重叠io事件不在信号状态中.
unicellular 2011-04-19
  • 打赏
  • 举报
回复
不明白, .
是不是没办法取得进度?
wangzejing20 2008-09-29
  • 打赏
  • 举报
回复
谢谢
僵哥 2008-09-28
  • 打赏
  • 举报
回复
TransmitFile为的是提高性能而设计的.只有当完成或者失败才会通过相应的机制通知状态.在此之前并没有任何通知机制.
僵哥 2008-09-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qgw_2000 的回复:]
你可以使用winsock中的Overlapped IO模型。

1.使用WSA_FLAG_OVERLAPPED标志创建套接字

2.为TransmitFile指定一个WSAOVERLAPPED结构,在Overlapped IO模型下TransmitFile会很快返回

3.定时调用或者在一个线程里定时调用WSAGetOverlappedResult检查进度,其中lpcbTransfer参数返回为发送了多少字节,可以根据它计算进度。

调用WSAGetOverlappedResult时,参数s为最初创建的socket,lpOverlapped就是传给TransmitFi…
[/Quote]
If WSAGetOverlappedResult succeeds, the return value is TRUE. This means that the overlapped operation has completed successfully and that the value pointed to by lpcbTransfer has been updated. If WSAGetOverlappedResult returns FALSE, this means that either the overlapped operation has not completed, the overlapped operation completed but with errors, or the overlapped operation's completion status could not be determined due to errors in one or more parameters to WSAGetOverlappedResult. On failure, the value pointed to by lpcbTransfer will not be updated. Use WSAGetLastError to determine the cause of the failure (either of WSAGetOverlappedResult or of the associated overlapped operation).
qgw_2000 2008-09-28
  • 打赏
  • 举报
回复
你可以使用winsock中的Overlapped IO模型。

1.使用WSA_FLAG_OVERLAPPED标志创建套接字

2.为TransmitFile指定一个WSAOVERLAPPED结构,在Overlapped IO模型下TransmitFile会很快返回

3.定时调用或者在一个线程里定时调用WSAGetOverlappedResult检查进度,其中lpcbTransfer参数返回为发送了多少字节,可以根据它计算进度。

调用WSAGetOverlappedResult时,参数s为最初创建的socket,lpOverlapped就是传给TransmitFile的WSAOVERLAPPED结构的指针,设置fWait为FALSE表示函数立即返回,不等待IO操作完成。

BOOL WSAGetOverlappedResult(
SOCKET s,
LPWSAOVERLAPPED lpOverlapped,
LPDWORD lpcbTransfer,
BOOL fWait,
LPDWORD lpdwFlags
);

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧