社区
网络编程
帖子详情
InternetReadFileEx的问题
Areslee
2008-07-25 01:37:48
我在使用InternetReadFileEx下载网络文件的时候,发现如果文件较大(大约9000字节),则InternetReadFileEx会有很奇怪的反应:明明已经读到了一些数据,可是dwBufferLength的值不变,要等到第二次再读到数据(覆盖掉第一次读的数据)之后,dwBufferLength才会变化
请问这是怎么回事?
...全文
486
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
A才行,于是才将此
问题
解决。我说做接口的人做了出来怎么就
WinInet API 的异步方式使用
使用异步方式是解决这类
问题
的正确手段,下面我们根据一个实例来分析一下 WinInet API 异步方式的使用方法和注意事项。 我们的例子完成这样的功能:给定一个 URL (如: http://www.sina.com.cn/ ),使用 HTTP ...
WinInet编程经验点滴
写一个自己拿来玩的小东西要用到WinInet库,本以为一点点经验就可以了,没想到不断地出
问题
,不断的解决。没办法,只好把一个小经验变成点滴,也许将来还会变成合集.XD 之一 回调与线程 最近在写一个异步方式调用...
rc : Asynchronous http post
在程序退出时,强杀线程
问题
很多. 不只是内存泄漏. 退出的时机不同,有时还会崩溃。 在被杀线程中使用主线程中的类成员e.g. map, 如果被杀时,正在操作那个map, 在主线程map free的时候崩溃了。 用http同步+退出...
c++Get http获取JSON 以及WinInet:HTTPS 请求出现无效的证书颁发机构的处理
首先,微软提供的WinInet库封装了对网页访问的方法。 最近工作需要从https服务器获取数据,都知道https和http网页的访问方式不同,多了一道证书认证... 下面贴上我的解决前的代码,再对比我遇到
问题
之后的代码,...
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章