1、InternetCrackUrl解析:
BOOL WINAPI InternetCrackUrl( LPCTSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags, LPURL_COMPONENTS lpUrlComponents );
1)参数:(1)lpszUrl表示要解析的url,例如:http://www.123.com/456
(2)dwUrlLength表示上面要解析的url的长度。
(3)dwFlags表示标志位ICU_DECODE,ICU_ESCAPE
2)注释:一般来说,URL中可以存在用户名、密码、协议头、域名、路径等信息。InternetCrackUrl函数可以帮你分析出这些数据,所以它要求提供空间来保存它分析的数据。对于不需要的数据,传NULL就可以了。分析到的数据填充到URL_COMPONENTS结构体中。
3)使用举例(代码来源:Google breakpad):
wchar_t scheme[16], host[256], path[256];
URL_COMPONENTS components;
memset(&components, 0, sizeof(components));
components.dwStructSize = sizeof(components);
components.lpszScheme = scheme;
components.dwSchemeLength = sizeof(scheme) / sizeof(scheme[0]);
components.lpszHostName = host;
components.dwHostNameLength = sizeof(host) / sizeof(host[0]);
components.lpszUrlPath = path;
components.dwUrlPathLength = sizeof(path) / sizeof(path[0]);
if (!InternetCrackUrl(url.c_str(), static_cast<DWORD>(url.size()),
0, &components)) {
return false;
}
解析:scheme,是http还是https;host,域名(如:www.123.com);path:路径(如:/456)。
2、InternetOpen解析:
HINTERNET WINAPI InternetOpen( LPCTSTR lpszAgent, DWORD dwAccessType, LPCTSTR lpszProxy, LPCTSTR lpszProxyBypass, DWORD dwFlags );
1)参数:(1)lpszAgent,http协议中的Uesr-Agent字段(如:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11)。
(2)dwAccess,InternetOpen的访问类型。(下面四个访问类型的解析来源:百度百科)INTERNET_OPEN_TYPE_DIRECT,使用直接连接网络;INTERNET_OPEN_TYPE_PRECONFIG,获取代理或直接从注册表中的配置,使用代理连接网络;INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,获取代理或直接从注册表中的配置,并防止启动Microsoft JScript或Internet设置(INS)文件的使用;INTERNET_OPEN_TYPE_PROXY,通过代理的请求,除非代理旁路列表中提供的名称解析绕过代理,在这种情况下,该功能的使用。
(3)lpszProxy,指针指向一个空结束的字符串,该字符串指定的代理服务器的名称,不要使用空字符串;如果dwAccessType未设置为INTERNET_OPEN_TYPE_PROXY,则此参数应该设置为NULL。(解析来着百度百科)
(4)lpszProxyBypass,指向一个空结束的字符串,该字符串指定的可选列表的主机名或IP地址。如果dwAccessType未设置为INTERNET_OPEN_TYPE_PROXY的 ,参数省略则为NULL。(解析来着百度百科)
(5)dwFlags,INTERNET_FLAG_ASYNC,使异步请求处理的后从这个函数返回的句柄。INTERNET_FLAG_FROM_CACHE,不进行网络请求,从缓存返回的所有实体,如果请求的项目不在缓存中,则返回一个合适的错误,如ERROR_FILE_NOT_FOUND。INTERNET_FLAG_OFFLINE,不进行网络请求,从缓存返回的所有实体,如果请求的项目不在缓存中,则返回一个合适的错误,如ERROR_FILE_NOT_FOUND。(解析来着百度百科)
2)解析:初始化一个应用程序,以使用 WinINet 函数。
3)举例(代码来源:Google breakpad):
static const wchar_t kUserAgent[] = L"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11";
AutoInternetHandle internet(InternetOpen(kUserAgent,
INTERNET_OPEN_TYPE_PRECONFIG,
NULL, // proxy name
NULL, // proxy bypass
0)); // flags
if (!internet.get()) {
return false;
}
3、InternetConnect解析:
HINTERNET WINAPI InternetConnect( HINTERNET hInternet, LPCTSTR lpszServerName, INTERNET_PORT nServerPort, LPCTSTR lpszUserName, LPCTSTR lpszPassword, DWORD dwService, DWORD dwFlags, DWORD dwContext );
1)参数:(1)hInternet,上述InternetOpen返回的句柄。(2)lpszServerName,域名。(3)nServerPort,端口号(http的有80、443,ftp是21,以及其他一些端口号)。(4)lpszUserName和lpszPassword用户名和密码。(5)dwService,指定访问的服务器类型,有INTERNET_SERVICE_FTP、INTERNET_SERVICE_HTTP两个宏定义。(6)dwFalgs,标志位。(7)dwContext,上下文。
(8)返回值:打开指定站点的ftp或者http会话成功的句柄。
2)功能:打开指定站点的ftp或者http会话。
3)举例:
AutoInternetHandle connection(InternetConnect(internet.get(), host, components.nPort, NULL, // user name NULL, // password INTERNET_SERVICE_HTTP, 0, // flags NULL)); // context if (!connection.get()) { return false; }
4、HttpOpenRequest解析:
HINTERNET WINAPI HttpOpenRequest( HINTERNET hConnect, LPCTSTR lpszVerb, LPCTSTR lpszObjectName, LPCTSTR lpszVersion, LPCTSTR lpszReferrer, LPCTSTR* lplpszAcceptTypes, DWORD dwFlags, DWORD dwContext );1)参数:(1)hConnet,InternetConnect成功返回的句柄。(2)lpszVerb,访问方式。在网页里只有get和post两种方法。
(3)lpszObjectName,域名后面的地址。
(4)lpszVersion,HTTP版本,默认为HTTP/1.0
(5)lpszReferrer,引用页,抓包得到的refer(6)lplpszAcceptAcceptType,执行一个程序接收的文件类型列表,把空值传递给HttpOpenRequest即通知了服务器只有文本文件可以被接收。
(7)dwFlags, Internet标志的掩码。举例:INTERNET_FLAG_KEEP_CONNECTION,在http协议中头添加上"Connection:Keep-Alive“字段;INTERNET_FLAG_NO_COOKIES,在http协议头中不自动增加"Cookie"字段。详情可参考:http://msdn.microsoft.com/zh-cn/subscriptions/aa917871.aspx
(8)dwContext,回调上下文。
(9)返回值,请求成功的句柄。
2、功能:创建一个请求句柄并且把参数存储在句柄中
3、举例:
DWORD http_open_flags = secure ? INTERNET_FLAG_SECURE : 0; http_open_flags |= INTERNET_FLAG_KEEP_CONNECTION; http_open_flags |= INTERNET_FLAG_NO_COOKIES; AutoInternetHandle request(HttpOpenRequest(connection.get(), L"POST", path, NULL, // version NULL, // referer NULL, // agent type http_open_flags, NULL)); // context if (!request.get()) { return false; }5、HttpAddRequestHeaders解析:BOOL WINAPI HttpAddRequestHeaders( HINTERNET hHttpRequest, LPCTSTR lpszHeaders, DWORD dwHeadersLength, DWORD dwModifiers );1)、参数:(1)hHttpRequest,http请求句柄;(2)lpszHeaders,http请求协议头;如:wstring head_accept = L"Accept: */*";(3)dwHeadersLength,lpszHeaders长度,如果这个参数是-1,该函数认为lpszHeaders是零字符结束,其长度被计算。(4)dwModifiers,修改操作标志,参考http://msdn.microsoft.com/zh-cn/subscriptions/aa919293.aspx(5)返回值,成功返回TRUE,否则返回FALSE.2)、功能:增加一个或多个http请求协议头到http请求句柄中。3)、举例:wstring head_accept = L"Accept: */*"; HttpAddRequestHeaders(request.get(), head_accept.c_str(), static_cast<DWORD>(-1), HTTP_ADDREQ_FLAG_ADD);注:在http协议头中再添加一个"Accept:*/*"6、HttpSendRequest解析:BOOL WINAPI HttpSendRequest( HINTERNET hRequest, LPCTSTR lpszHeaders, DWORD dwHeadersLength, LPVOID lpOptional, DWORD dwOptionalLength );1)、参数:(1)hRequest,HttpOpenRequest返回的句柄。(2)lpszHeaders,额外的协议头。(3)dwHeadersLength,额外协议头长度。(4)lpOptional,要发送到http服务器上的数据内容。(5)dwOPtionalLength,数据内容上的。2)、功能:把请求参数送到HTTP服务器3)、举例:if (!HttpSendRequest(request.get(), NULL, 0, const_cast<char *>(request_body.data()), static_cast<DWORD>(request_body.size()))) { return false; }7、HttpQueryInfo解析:BOOL WINAPI HttpQueryInfo( HINTERNET hRequest, DWORD dwInfoLevel, LPVOID lpBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex );1)、参数:(1)hRequest:HTTP请求返回的句柄。(2)wInfoLevel:指定的属性的组合查询和请求进行修改的标志。(3)lpBuffer:指针指向的缓冲区,接收的信息。(4)lpdwBufferLength:指针的值包含的数据缓冲区的长度。(5)lpdwIndex:长指针,用于列举多个具有相同名称的头一个从零开始的头索引,不需要可设置为NULL。2)、功能:查询一个HTTP请求的信息。
3)、举例:
wchar_t http_status[4]; DWORD http_status_size = sizeof(http_status); if (!HttpQueryInfo(request.get(), HTTP_QUERY_STATUS_CODE, static_cast<LPVOID>(&http_status), &http_status_size, 0)) { return false; }注:HTTP_QUERY_STATUS_CODE,接收由服务器返回的状态码.8、InternetQueryDataAvailable解析:BOOL InternetQueryDataAvailable( _In_ HINTERNET hFile, _Out_ LPDWORD lpdwNumberOfBytesAvailable, _In_ DWORD dwFlags, _In_ DWORD_PTR dwContext );1)参数:(1)hFile,HTTP请求返回的句柄。(2)lpdwNumberOfBytesAvailable, 用于存放数据长度的指针(3)dwFlags, 保留参数,置0 (4)dwContext,保留参数,置02)功能:查询可用数据的数量。3)举例:while (((return_code = InternetQueryDataAvailable(request, &bytes_available, 0, 0)) != 0) && bytes_available > 0) {
vector<char> response_buffer(bytes_available); DWORD size_read;
return_code = InternetReadFile(request, &response_buffer[0], bytes_available, &size_read);
if (return_code && size_read > 0) { total_read += size_read; response_body.append(&response_buffer[0], size_read); } else { break; } }
9、InternetReadFile解析:
BOOL WINAPI InternetReadFile( HINTERNET hFile, LPVOID lpBuffer, DWORD dwNumberOfBytesToRead, LPDWORD lpdwNumberOfBytesRead );
1)参数:(1)hFile,HTTP请求返回的句柄。(2)lpBuffer, 接受到数据的buffer(3)dwNumberOfBytesToRead [in], 欲读数据的字节量(4)lpdwNumberOfBytesRead [out],接收读取字节量的变量。该函数在做任何工作或错误检查之前都设置该值为零。2)功能:从一个由 HttpOpenRequest 函数打开的句柄中读取数据。3)举例:while (((return_code = InternetQueryDataAvailable(request, &bytes_available, 0, 0)) != 0) && bytes_available > 0) {
vector<char> response_buffer(bytes_available); DWORD size_read;
return_code = InternetReadFile(request, &response_buffer[0], bytes_available, &size_read);
if (return_code && size_read > 0) { total_read += size_read; response_body.append(&response_buffer[0], size_read); } else { break; } }