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 
#include 
#include 
#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;
}

你可能感兴趣的:(网络,计算机网络,网络安全)