社区
网络编程
帖子详情
InternetReadFileEx的问题
Areslee
2008-07-25 01:37:48
我在使用InternetReadFileEx下载网络文件的时候,发现如果文件较大(大约9000字节),则InternetReadFileEx会有很奇怪的反应:明明已经读到了一些数据,可是dwBufferLength的值不变,要等到第二次再读到数据(覆盖掉第一次读的数据)之后,dwBufferLength才会变化
请问这是怎么回事?
...全文
516
7
打赏
收藏
InternetReadFileEx的问题
我在使用InternetReadFileEx下载网络文件的时候,发现如果文件较大(大约9000字节),则InternetReadFileEx会有很奇怪的反应:明明已经读到了一些数据,可是dwBufferLength的值不变,要等到第二次再读到数据(覆盖掉第一次读的数据)之后,dwBufferLength才会变化 请问这是怎么回事?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
kioly0836
2011-05-16
打赏
举报
回复
[Quote=引用 5 楼 wineggdrop 的回复:]
引用 4 楼 Areslee 的回复:
引用 2 楼 WinEggDrop 的回复:
引用楼主 Areslee 的帖子:
我在使用InternetReadFileEx下载网络文件的时候,发现如果文件较大(大约9000字节),则InternetReadFileEx会有很奇怪的反应:明明已经读到了一些数据,可是dwBufferLength的值不变,要等到第二次再读到数据(覆盖掉第一次读的数据)之……
[/Quote]
确定这种下标写法没越界吗?
Areslee
2008-07-29
打赏
举报
回复
我靠!原来关键便是这一句:
lpReadBuff[InetBuff.dwBufferLength] = 0;
多谢兄台热心指点!
Areslee
2008-07-28
打赏
举报
回复
[Quote=引用 2 楼 WinEggDrop 的回复:]
引用楼主 Areslee 的帖子:
我在使用InternetReadFileEx下载网络文件的时候,发现如果文件较大(大约9000字节),则InternetReadFileEx会有很奇怪的反应:明明已经读到了一些数据,可是dwBufferLength的值不变,要等到第二次再读到数据(覆盖掉第一次读的数据)之后,dwBufferLength才会变化
请问这是怎么回事?
这是因为InternetReadFileEx()是使用异步的读取方式.就算这返回TRUE,只是代表了这API执行时没出错,但不代表这个…
[/Quote]
事实上我调用InternetReadFileEx的时候已经是收到INTERNET_STATUS_REQUEST_COMPLETE了。
在读的数据少时,只是反应不太对(读到数据后不修改dwBufferLength,第二次调用才修改),还没造成错误
在读的数据多时,第一次读到部分数据,但没有修改dwBufferLength,我也没办法随之修正lpvBuffer,于是后面读的数据直接覆盖掉前面的,郁闷死了
WinEggDrop
2008-07-28
打赏
举报
回复
[Quote=引用 4 楼 Areslee 的回复:]
引用 2 楼 WinEggDrop 的回复:
引用楼主 Areslee 的帖子:
我在使用InternetReadFileEx下载网络文件的时候,发现如果文件较大(大约9000字节),则InternetReadFileEx会有很奇怪的反应:明明已经读到了一些数据,可是dwBufferLength的值不变,要等到第二次再读到数据(覆盖掉第一次读的数据)之后,dwBufferLength才会变化
请问这是怎么回事?
这是因为InternetReadFileEx()是使用异步的读取方式.就算这返回TRUE,只是代表了…
[/Quote]
这里是有两种情况的:
1.执行InternetReadFileEx()返回TRUE,没必要等待INTERNET_STATUS_REQUEST_COMPLETE.
2.InternetReadFileEx()返回FALSE,而且GetLastError() == ERROR_IO_PENDING,那么就要等待INTERNET_STATUS_REQUEST_COMPLETE这个信号.
dwBufferLength如果返回的值是0,这代表已经没有数据可读了.
INTERNET_BUFFERS InetBuff,InetBuff中的值每次执行InternetReadFileEx()前都要重置,一般会是以下方式:
char lpReadBuff[4 * 1024];
while(TRUE)
{
INTERNET_BUFFERS InetBuff;
FillMemory(&InetBuff, sizeof(InetBuff), 0);
InetBuff.dwStructSize = sizeof(InetBuff);
InetBuff.lpvBuffer = lpReadBuff;
InetBuff.dwBufferLength = sizeof(lpReadBuff);
if (!InternetReadFileEx(.....))
{
if (GetLastError() == ERROR_IO_PENDING)
{
等待INTERNET_STATUS_REQUEST_COMPLETE信号
}
}
lpReadBuff[InetBuff.dwBufferLength] = 0;
if (InetBuff.dwBufferLength == 0)
{
break;
}
}
WinEggDrop
2008-07-27
打赏
举报
回复
如果可以,并不推荐使用异步的wininet的API.因为这部分实在是太混乱,微软本身对于这方面的文档也做得不好,基本没提供多少例子和说明.微软2003的sdk中的某个sample,运行后还会crash的.
WinEggDrop
2008-07-26
打赏
举报
回复
[Quote=引用楼主 Areslee 的帖子:]
我在使用InternetReadFileEx下载网络文件的时候,发现如果文件较大(大约9000字节),则InternetReadFileEx会有很奇怪的反应:明明已经读到了一些数据,可是dwBufferLength的值不变,要等到第二次再读到数据(覆盖掉第一次读的数据)之后,dwBufferLength才会变化
请问这是怎么回事?
[/Quote]
这是因为InternetReadFileEx()是使用异步的读取方式.就算这返回TRUE,只是代表了这API执行时没出错,但不代表这个API已经完成执行.你要在callback中接收到INTERNET_STATUS_REQUEST_COMPLETE的信号,才代表执行完成,这时侯你才能知道真正读到多少数据;或者在callback内得到其它出错的信号等.
Areslee
2008-07-26
打赏
举报
回复
有人明白吗?
Fuck微软 Wince异步的方式需要使用
Internet
ReadFile
Ex
A而非
Internet
ReadFile
Ex
。Win32可以是用
Internet
ReadFile
Ex
本文详细阐述了在Wince平台上使用
Internet
ReadFile
Ex
获取数据时遇到的
问题
及其解决方法,包括从同步到异步操作的转换,并通过论坛求助最终找到解决方案的过程。
Wininet.dll 版本引起的PostData返回数据为空
本文探讨了一个在WinXp环境下使用
Internet
ReadFile
Ex
等API时未返回数据的
问题
。通过升级IE版本至IE8,
问题
得以解决。分析了不同IE版本与Wininet.dll的关系,以及WININET.dll的历史版本变迁。
WinInet编程经验点滴
本文探讨了使用WinInet库进行网络编程时遇到的
问题
及解决方案,包括回调函数的正确使用方式以及
Internet
ReadFile
Ex
()读取大文件时的注意事项。
WinInet API 的异步方式使用
本文介绍如何使用WinInetAPI的异步方式进行HTTP文件下载。通过创建多个线程,利用
Internet
OpenUrl和
Internet
ReadFile
Ex
等API,实现主线程对下载进程的监控与控制。
WinInet编程中如何使用异步
本文详细介绍使用WinInet API进行异步编程的方法,包括
Internet
OpenUrl和
Internet
ReadFile
Ex
等函数的异步使用技巧,以及如何通过回调函数实现网络请求的监控。
网络编程
18,356
社区成员
64,165
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章