InternetReadFileEx的问题

Areslee 2008-07-25 01:37:48
我在使用InternetReadFileEx下载网络文件的时候,发现如果文件较大(大约9000字节),则InternetReadFileEx会有很奇怪的反应:明明已经读到了一些数据,可是dwBufferLength的值不变,要等到第二次再读到数据(覆盖掉第一次读的数据)之后,dwBufferLength才会变化
请问这是怎么回事?
...全文
486 7 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
有人明白吗?

18,356

社区成员

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

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