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