gpt4 book ai didi

c++ - 如何使用 WinINet 查找网页是否存在

转载 作者:行者123 更新时间:2023-11-30 04:22:58 32 4
gpt4 key购买 nike

我正在尝试连接并确保我们设计的仪器提供的网络服务器上存在各种页面。我正在尝试使用 WinInet 命令通过 C++ Win32 执行此操作。

我很高兴我已经通过 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为webserver运行单位地址,galogo.png为首页显示图片。另请注意,我在每个语句之间进行错误检查,因此如果我确实断开以太网连接,则会出现故障。

最初我只是尝试连接到 home.html 页面,但这总是通过,所以我想我应该尝试获取图像,但我可能缺乏知识。其他示例似乎随后流式传输数据,但我不确定是否需要这样做。

我看到的大多数示例似乎都以这种格式显示 HtppSendRequest,我不太了解 header 等。也许我在这里出错了。

最佳答案

HttpQueryInfo 函数将提供与请求相关的 header 信息,您可以从中提取 HTTP 状态代码。

您可以使用更高级别的 WinINet 函数更轻松地获得结果。我会建议一个由 InternetOpen、InternetOpenUrl、HttpQueryInfo 组成的序列,然后如果 HTTP 状态代码正常,则重复调用 InternetReadFile。

这个 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;

关于c++ - 如何使用 WinINet 查找网页是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13564947/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com