Как я могу узнать, существует ли веб-страница с использованием WinINet

Я пытаюсь подключиться и обеспечить наличие различных страниц на веб-сервере, предоставляемом инструментом, который мы разрабатываем. Я пытаюсь сделать это через C ++ Win32 с помощью команд WinInet.

Я счастлив, что правильно подключился к веб-серверу через HTTP:

hInternet = InternetOpen("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0/*INTERNET_FLAG_ASYNC*/);
hhttp = InternetConnect(hInternet, "192.168.111.222", INTERNET_DEFAULT_HTTP_PORT, "admin", "admin", INTERNET_SERVICE_HTTP, 0, 0);

Я считаю, что тогда я должен открыть запрос.

hHttpRequest = HttpOpenRequest(hhttp, "GET", "galogo.png", NULL, "192.168.111.222", lplpszAcceptTypes, INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE, 0);

а затем отправьте запрос.

HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0)

Примечание. 192.168.111.222 — это адрес устройства, на котором работает веб-сервер, а galogo.png — это изображение, отображаемое на домашней странице. Также обратите внимание, что я проверяю ошибки между каждым оператором, поэтому, если я отключаю Ethernet, я получаю ошибку.

Сначала я пытался просто подключиться к странице home.html, но это всегда проходило, поэтому я подумал, что должен попытаться получить изображение, но мне, вероятно, не хватает знаний. Другие примеры, кажется, затем передают данные, но я не был уверен, нужно ли мне это делать.

Кажется, что большинство примеров, которые я видел, показывают HtppSendRequest в этом формате, и я не очень понимаю о заголовках и т. Д. Возможно, именно здесь я иду неправильно.

1

Решение

Функция HttpQueryInfo выдаст информацию заголовка, относящуюся к запросу, и вы можете извлечь из этого код состояния HTTP.

Возможно, вам будет проще достичь результата, используя функции WinINet более высокого уровня. Я бы предложил последовательность, состоящую из InternetOpen, InternetOpenUrl, HttpQueryInfo, а затем повторные вызовы InternetReadFile, если код состояния HTTP в порядке.

Этот код Delphi (из Delphi 7, так что до Unicode), кажется, делает эту работу:

function GetUrlContent(const Agent, Url: string): string;
var
NetHandle: HINTERNET;
UrlHandle: HINTERNET;
Buffer: array [0..1024] of Char;
BytesRead: DWORD;
Dummy: DWORD;
BufLen: DWORD;
HttpStatus: string;
begin
Result := '';
NetHandle := InternetOpen(PChar(Agent), INTERNET_OPEN_TYPE_PRECONFIG,
nil, nil, 0);

if Assigned(NetHandle) then
begin
UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0,
INTERNET_FLAG_RELOAD, 0);

if Assigned(UrlHandle) then
// UrlHandle valid?  Proceed with download.
try
BufLen := Length(Buffer);
Dummy := 0;
// only get the file if the HTTP status code is 200
if HttpQueryInfo(UrlHandle, HTTP_QUERY_STATUS_CODE, @Buffer[0], BufLen, Dummy) then
begin
HttpStatus := Buffer;
if HttpStatus = '200' then
begin
FillChar(Buffer, SizeOf(Buffer), 0);
repeat
Result := Result + Buffer;
FillChar(Buffer, SizeOf(Buffer), 0);
InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
until BytesRead = 0;
end
else begin
raise Exception.CreateFmt('HTTP status code %s', [HttpStatus]);
end;
end
else begin
raise Exception.Create('Unable to read HTTP status code');
end;
finally
InternetCloseHandle(UrlHandle);
end
else begin
// UrlHandle is not valid.  Raise an exception.
raise Exception.CreateFmt('Cannot open URL %s', [Url]);
end;
InternetCloseHandle(NetHandle);
end
else begin
// NetHandle is not valid.  Raise an exception.
raise Exception.Create('Unable to initialize WinINet');
end;
end;
2

Другие решения

Итак, используя комбинацию cURL и Wireshark, я наконец-то здесь. Я делал некоторые фундаментальные ошибки, но в основном на правильном пути.

Сначала откройте соединение и подключитесь, как указано ранее, убедившись, что это не ASYNC (это приводит к некоторым ошибкам ввода-вывода с перекрытием):

hInternet = InternetOpen("Test", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0/*INTERNET_FLAG_ASYNC*/);

hhttp = InternetConnect(hInternet, "192.168.111.222", INTERNET_DEFAULT_HTTP_PORT, "admin", "admin", INTERNET_SERVICE_HTTP, 0, 0);

Мне нужно было создать запрос и затем отправить его. Мне нужно было только указать страницу, так как запрос будет принимать в деталях подключения.

hHttpRequest = HttpOpenRequest(hhttp, "GET", "home.html", NULL, NULL, lplpszAcceptTypes, INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE, 0);

HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);

Затем используйте функцию HttpQueryInfo, чтобы получить статус и преобразовать обратно в целое число. Убедитесь, что вы отправляете дескриптор из запроса, а не подключения.

//These are defined earlier
DWORD statCharLen = 0;
char statChar[256]="";
statCharLen = sizeof(statChar);

HttpQueryInfo(hHttpRequest, HTTP_QUERY_STATUS_CODE, statChar, &statCharLen, NULL);

Наконец отключите соединение:

InternetCloseHandle(hInternet)

Спасибо

0

Это просто следующие шаги:
1- Открытое соединение
2- Подключить
3- Открытый запрос
4- Отправить запрос
5- Читать файл
6 — сохранить файл (в формате png или jpg)
7- Закрыть ручки
Код выглядит следующим образом:

#include <iostream>
#include <string>
#include <Windows.h>
#include <wininet.h>
#pragma comment(lib, "wininet")

using namespace std;
void download(string domain,string url,string filepath)
{
//Step 1:
HINTERNET hIntSession = InternetOpenA("MyApp", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
//Step 2:
HINTERNET hHttpSession = InternetConnectA(hIntSession, domain.c_str(), 80, 0, 0, INTERNET_SERVICE_HTTP, 0, NULL);
//Step 3:
HINTERNET hHttpRequest = HttpOpenRequestA( hHttpSession, "GET",url.c_str(),0, 0, 0, INTERNET_FLAG_RELOAD, 0);
TCHAR* szHeaders = L"";
CHAR szReq[1024] = "";
//Step 4:
if( !HttpSendRequest(hHttpRequest, szHeaders, wcslen(szHeaders), szReq, strlen(szReq))) {
DWORD dwErr = GetLastError();
cout<<"error "<<dwErr<<endl;
/// handle error
}
TCHAR szBuffer[1025];
DWORD dwRead=0;
FILE *f;
f=fopen(filepath.c_str(),"wb");
//Step 5 & 6:
while(InternetReadFile(hHttpRequest,szBuffer, 1024, &dwRead) && dwRead)
{
fwrite(szBuffer,sizeof(BYTE),1024,f);
dwRead=0;
}
fclose(f);
//Step 7:
InternetCloseHandle(hHttpRequest);
InternetCloseHandle(hHttpSession);
InternetCloseHandle(hIntSession);
}
int main()
{
download("www.stacktoheap.com","images/stackoverflow.png","C:\\Example\\example.png");
}
0
По вопросам рекламы [email protected]