从Web URL下载内容

Downloading content from web URL

本文关键字:下载 URL Web      更新时间:2023-10-16

我正在尝试使用WinInet.h从URL地址获取数据。这是我简化的代码:

LPCTSTR url = (LPCTSTR) "https://example.com"; // 2.9.1
HINTERNET connection = InternetOpenA(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET request = InternetOpenUrlA(connection, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
char status_code[10];
DWORD info_size = 10000;
HttpQueryInfoA(request, HTTP_QUERY_STATUS_CODE, status_code, &info_size, NULL);
DWORD size;
DWORD dwRead = 0;
InternetQueryDataAvailable(request, &size, 0, 0); // size = 5
char * buffer = new char[size]; // size = 5
InternetReadFile(request, buffer, size, &dwRead);
OutputDebugString(buffer); // 1.2.3ýýýý
InternetCloseHandle(connection);
InternetCloseHandle(request);

它运行良好,但是URL地址上的数据是2.9.1,但缓冲区返回2.9.1ýýýý

如果我尝试在字符之后打印字符,这就是结果:

for (int i = 0; i < size; i++)
    OutputDebugString(&buffer[i]);
char[0] = 2.9.1ýýýý
char[1] = .9.1ýýýý
char[2] = 9.1ýýýý
char[3] = .1ýýýý
char[4] = 1ýýýý

谁能向我解释为什么会发生这种情况?

您要接收的数据是C风格的字符串,即零字符终止字符数组。这里重要的部分是,实际上有5个字符的字符串需要大小6的数组,例如:

"hello"

由6个字符的数组组成,'h''e''l''l''o'''

OutputDebugString将通过数组打印字符,直到达到 ''

在这种情况下,您不会在任何地方分配终止''的任何地方,因此OutputDebugString将继续进行,直到内存中恰好有''(或直到它到达内存,它不允许访问(。

(。 (。

更改此位:

char * buffer = new char[size]; // size = 5
InternetReadFile(request, buffer, size, &dwRead);

char * buffer = new char[size + 1]; // size = 5, allocate 6 chars
InternetReadFile(request, buffer, size, &dwRead);
buffer [size] = '';