请问这里InternetOpenUrl为什么老是出错?

vanxining 2008-09-15 04:06:55
#include <windows.h>
#include <wininet.h>
#include <iostream>
#pragma comment(lib, "Wininet.lib")

void Download(char url[]);

int main(int argc, char *argv[])
{

Download("www.baidu.com");

return 0;
}


void Download(char url[])
{
char buffer[100000];//下载文件的缓冲区
DWORD bytes_read;//下载的字节数

//打开一个internet连接
HINTERNET internet=InternetOpen("HTTP Downloader",INTERNET_OPEN_TYPE_PRECONFIG,NULL, NULL, NULL);

if(!internet)
throw "InternetOpen error!";

//打开一个http url地址
HINTERNET file_handle=InternetOpenUrl(internet, url, NULL, 0,INTERNET_FLAG_RELOAD, 0);

if(!file_handle)
//throw "InternetOpenUrl error! - Maybe you should add Http:// or Ftp://";
cout<<"失败!\n";
return;

//从url地址中读取文件内容到缓冲区buffer
BOOL b = InternetReadFile(file_handle, buffer, 100000, &bytes_read);
if(!b)
throw "InternetReadFile error!";

buffer[bytes_read] = 0;

//cout << buffer << endl << endl;

//关闭连接
InternetCloseHandle(internet);

cout<<buffer;
}


我原本用得好好的,不知怎么的忽然就不行了。

谢谢大家。
...全文
439 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
vanxining 2008-10-01
  • 打赏
  • 举报
回复
大家误会我的意思了。
问题不是出在缓冲区上,而是InternetOpenUrl上。

greatws 2008-09-15
  • 打赏
  • 举报
回复
还有阿,缓冲区大小有问题InternetReadFile(file_handle, buffer, 100000, &bytes_read);

100000个字节,只能写99999,因为作为字符串处理,要加上\0,你想一下,如果接收到的正好等于缓冲区大小,buffer[100000] = 0;这样不就越界了?

char buffer[100000];//下载文件的缓冲区
栈的空间有限,不要在栈上分配这么多,比较大的,一般是用new在堆上分配
greatws 2008-09-15
  • 打赏
  • 举报
回复
cout < <"失败!\n";
return;
//从url地址中读取文件内容到缓冲区buffer


这样不是每次都return了?

if(!file_handle)
{
//throw "InternetOpenUrl error! - Maybe you should add Http:// or Ftp://";
cout < <"失败!\n";
return;
}
jameshooo 2008-09-15
  • 打赏
  • 举报
回复
用GetLastError()看看出错原因

18,356

社区成员

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

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