05.WinInet API基础

API:

InternetOpen:

初始化应用程序对WinINet的使用

  • 函数原型:
    HINTERNET InternetOpenA(
      [in] LPCSTR lpszAgent,
      [in] DWORD  dwAccessType,
      [in] LPCSTR lpszProxy,
      [in] LPCSTR lpszProxyBypass,
      [in] DWORD  dwFlags
    );
    
  • 参数:
    • lpszAgent:指向一个字符串,指定调用WinINet函数的应用程序或者实体的名称,此名称用作HTTP协议中的用户代理
    • dwAccessType:所需访问的类型
    • lpszProxy:指向一个字符串,该字符串指定代理服务器的名称
    • lpszProxyBypass:指定主机名或IP地址
    • dwFlags:选项
  • 返回值:返回应用程序传递给后续WinINet函数的有效句柄

InternetCloseHandle:

关闭单个Internet句柄,如果成功关闭,则返回TRUE;

InternetOpenUrlA:

打开由完整的FTP或HTTP URL指定的资源

  • 函数原型:
    HINTERNET InternetOpenUrlA(
      [in] HINTERNET hInternet,
      [in] LPCSTR    lpszUrl,
      [in] LPCSTR    lpszHeaders,
      [in] DWORD     dwHeadersLength,
      [in] DWORD     dwFlags,
      [in] DWORD_PTR dwContext
    );
    
  • 参数:
    • hInternet:当前Internet会话的句柄,也就是我们初始化的句柄
    • lpszUrl:指向要请求的URL
    • lpszHeaders:只想要发送到HTTP服务器的标头
    • dwHeadersLength:附加标头的大小
    • dwFlags:
    • dwContext:上下文
  • 返回值:如果成功建立,则返回URL的有效句柄,如果失败的话就返回NULL

InternetReadFile:

从InternetOpenUrl,FtpOpenFile或HttpOpenRequest函数打开的句柄读取数据

  • 函数原型:
    BOOL InternetReadFile(
      [in]  HINTERNET hFile,
      [out] LPVOID    lpBuffer,
      [in]  DWORD     dwNumberOfBytesToRead,
      [out] LPDWORD   lpdwNumberOfBytesRead
    );
    
  • 参数:
    • hFile:从上次调用函数返回的HINTERNET句柄
    • lpBuffer:缓冲区
    • dwNumberOfBytesToRead:要读多少个字节
    • lpdwNumberOfBytesRead:实际上读取的自己
  • 返回值:成功返回TRUE

URLDownloadToFile

从Internet下载文件并将其保存到文件中

  • 函数原型:

    HRESULT URLDownloadToFile(
                 LPUNKNOWN            pCaller,
                 LPCTSTR              szURL,
                 LPCTSTR              szFileName,
      _Reserved_ DWORD                dwReserved,
                 LPBINDSTATUSCALLBACK lpfnCB
    );
    
  • 参数:

    • pCaller:NULL
    • szURL:URL字符串的指针
    • szFileName:指向创建文件的名称或完整路径
    • dwResvered:保留
    • lpfnCB:NULL
  • 返回值:

    返回代码 描述
    S_OK
    下载已成功启动。

    E_OUTOFMEMORY
    缓冲区长度无效,或者内存不足,无法完成操作。

    INET_E_DOWNLOAD_FAILURE
    指定的资源或回调接口无效。

InternetAttemptConnect

尝试建立与Internet的连接

如果成功,返回ERROR_SUCCESS

InternetCheckConnectionA

如果可以建立与Internet的连接,则允许应用程序检查

  • 函数原型:
    BOOL InternetCheckConnectionA(
      [in] LPCSTR lpszUrl,
      [in] DWORD  dwFlags,
      [in] DWORD  dwReserved
    );
    
  • 参数:
    • lpszUrl:指定URL
    • dwFlags:当前唯一可用标志:FLAG_ICC_FORCE_CONNECTION
    • dwReserved:保留,为0
  • 返回值:如果连接成功,则返回TRUE

InternetConnectA

打开指定站点(FTP)或HTTP会话的文件传输协议;

  • 函数原型:
    HINTERNET InternetConnectA(
      [in] HINTERNET     hInternet,
      [in] LPCSTR        lpszServerName,
      [in] INTERNET_PORT nServerPort,
      [in] LPCSTR        lpszUserName,
      [in] LPCSTR        lpszPassword,
      [in] DWORD         dwService,
      [in] DWORD         dwFlags,
      [in] DWORD_PTR     dwContext
    );
    
  • 参数:
    • hInternet:初始化返回的HINTERNET句柄
    • lpszServerName:服务器的主机名
    • nServerPort:传输协议端口
    • lpszUserName:用户名
    • lpszPassword:登录密码
    • dwService:服务类型
    • dwFlags:特定服务器的选项
    • dwContext:上下文
  • 返回值:如果连接成功,返回有效的句柄

HttpOpenRequest:

创建HTTP请求句柄

  • 函数原型:
    HINTERNET HttpOpenRequestA(
      [in] HINTERNET hConnect,
      [in] LPCSTR    lpszVerb,
      [in] LPCSTR    lpszObjectName,
      [in] LPCSTR    lpszVersion,
      [in] LPCSTR    lpszReferrer,
      [in] LPCSTR    *lplpszAcceptTypes,
      [in] DWORD     dwFlags,
      [in] DWORD_PTR dwContext
    );
    
  • 参数:
    • hConnect:InternetConnect返回的HTTP会话句柄
    • lpszObjectName:指定HTTP请求
    • lpszVersion:协议版本
    • lpszReferrer:URL
    • lplpszAcceptTypes:客户端接受的媒体类型
    • dwFlags:Internet选项
    • dwContext:上下文
  • 返回值:如果成功,返回HTTP请求句柄

HttpSendRequest

将指定的请求发送到HTTP服务器;

  • 函数原型:

    BOOL HttpSendRequestA(
      [in] HINTERNET hRequest,
      [in] LPCSTR    lpszHeaders,
      [in] DWORD     dwHeadersLength,
      [in] LPVOID    lpOptional,
      [in] DWORD     dwOptionalLength
    );
    
  • 参数:

    • hRequest:调用HttpOpenRequest返回的句柄
    • lpszHeaders:请求头
    • dwHeadersLength:头长度
    • lpOptional:指向缓冲区(数据)
    • dwOptionalLength:可选数据的大小
  • 返回值:

    如果成功,则返回 TRUE

#include <iostream>
#include <Windows.h>
#include <WinInet.h>
#pragma comment(lib,"WinInet.lib")
#pragma comment(lib,"Urlmon.lib")

int main() {
	//WinInet初始化:
	HINTERNET hInternet = InternetOpen(NULL, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL);
	//判断是否有效:
	if (hInternet == NULL) {
		InternetCloseHandle(hInternet);
	}
	//打开HTTP或者FTP:
	char szUrl[] = "https://www.baidu.com";
	HINTERNET hInternet2 = InternetOpenUrlA(hInternet, szUrl, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, NULL);
	
	//下载网页内容
	char* szBuffer = new char[500]{ 0 };
	DWORD dwReadSize = 0;
	InternetReadFile(hInternet2, szBuffer, 500, &dwReadSize);

	URLDownloadToFile(NULL, L"https://www.baidu.com", L"D:\\baidu.html", NULL, NULL);
	//文件上传:InternetWriteFile

	//检测本地网络:
	if (InternetAttemptConnect(0) == ERROR_SUCCESS) {
		printf("本地连接正常\r\n");
	}
	//检测指定主机:
	if (InternetCheckConnectionA("https://www.baidu.com", FLAG_ICC_FORCE_CONNECTION, 0) == TRUE) {
		printf("正常\r\n");
	}

	//与HTTP有关;
	//访问:
	HINTERNET hRes = InternetConnectA(hInternet, "www.baidu.com", INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL);
	HINTERNET hHttp = HttpOpenRequest(hRes, L"GET", NULL, L"HTTP/1.1", NULL, NULL, INTERNET_FLAG_RELOAD, 0);

	//发包:
	HttpSendRequest(hHttp, NULL, NULL, NULL, NULL);
	system("pause");
	return 0;
}
调用的DLL命令: .DLL命令 InternetOpenA, 整数型, "WinINet.dll" .参数 lpszAgent, 文本型 .参数 dwAccessType, 整数型 .参数 lpszProxyName, 文本型 .参数 lpszProxyBypass, 文本型 .参数 dwFlags, 整数型 .DLL命令 InternetCloseHandle, 逻辑型, "WinINet.dll" .参数 hInternet, 整数型 .DLL命令 InternetConnectA, 整数型, "WinINet.dll" .参数 hInternet, 整数型 .参数 lpszServerName, 文本型 .参数 nServerPort, 整数型 .参数 lpszUserName, 文本型 .参数 lpszPassword, 文本型 .参数 dwService, 整数型 .参数 dwFlags, 整数型 .参数 dwContext, 整数型 .DLL命令 HttpOpenRequestA, 整数型, "WinINet.dll" .参数 hConnect, 整数型 .参数 lpszVerb, 文本型 .参数 lpszObjectName, 文本型 .参数 lpszVersion, 文本型 .参数 lpszReferer, 文本型 .参数 lplpszAcceptTypes, 文本型 .参数 dwFlags, 整数型 .参数 dwContext, 整数型 .DLL命令 HttpSendRequestA, 逻辑型, "WinINet.dll" .参数 hRequest, 整数型 .参数 lpszHeaders, 文本型 .参数 dwHeadersLength, 整数型 .参数 lpOptional, 文本型 .参数 dwOptionalLength, 整数型 .DLL命令 InternetReadFile, 逻辑型, "WinINet.dll" .参数 hFile, 整数型 .参数 lpBuffer, 字节集, 传址 .参数 dwNumberOfBytesToRead, 整数型 .参数 lpdwNumberOfBytesRead, 整数型, 传址 .DLL命令 HttpQueryInfoA, 逻辑型, "WinINet.dll" .参数 hRequest, 整数型 .参数 dwInfoLevel, 整数型 .参数 lpvBuffer, 文本型, 传址 .参数 lpdwBufferLength, 整数型, 传址 .参数 lpdwIndex, 整数型 .DLL命令 InternetSetCookieA, 逻辑型, "WinINet.dll" .参数 lpszUrl, 文本型 .参数 lpszCookieName, 文本型 .参数 lpszCookieData, 文本型 .DLL命令 CreateThread, 整数型 .参数 lpThreadAttributes, 整数型 .参数 dwStackSize, 整数型 .参数 lpStartAddress, 子程序指针 .参数 lpParameter, 整数型 .参数 dwCreationFlags, 整数型 .参数 lpThreadId, 整数型, 传址 .DLL命令 CloseHandle, 逻辑型 .参数 hObject, 整数型 .DLL命令 TerminateThread, 逻辑型 .参数 hThread, 整数型 .参数 dwExitCode, 整数型 .DLL命令 MsgWaitForMultipleObjects, 整数型 .参数 nCount, 整数型 .参数 pHandles, 整数型, 传址 .参数 bWaitAll, 逻辑型 .参数 dwMilliseconds, 整数型 .参数 dwWakeMask, 整数型 .DLL命令 HttpAddRequestHeaders, , "wininet.dll", "HttpAddRequestHeadersA" .参数 hRequest, 整数型 .参数 lpszHeaders, 文本型, 传址 .参数 dwHeadersLength, 整数型 .参数 dwModifiers, 整数型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shad0w-2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值