基于微软公司的动态链接库 wininet.dll
第一 创建 Session .
使用 InternetOpen 获得一个 Session 句柄
lpszAgent-为任意的一个字符串
dwAccessType 类型
INTERNET_OPEN_TYPE_DIRECT
INTERNET_OPEN_TYPE_PRECONFIG
INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY
INTERNET_OPEN_TYPE_PROXY
1 使用代理
dwAccessType 选择 INTERNET_OPEN_TYPE_PROXY
2 不使用代理
dwAccessType选择 INTERNET_OPEN_TYPE_DIRECT
第二 创建连接
使用 InternetConnect
参数:
hInternet – 选择第一步获得的session 句柄
lpszServerName – 选择一个服务器地址或者域名
nServerPort – 服务的端口号 ,一般 http服务端口为80 Ftp 服务端口为21
lpszUserNam – 用户名
lpszPassword – 密码
dwService – 为要选择的服务
INTERNET_SERVICE_HTTP
INTERNET_SERVICE_FTP
dwFlags – 如果您选择了Ftp服务那么您可以使用
INTERNET_FLAG_PASSIVE 为 被动连接
http服务一般为 0
dwContext – 在异步的时候 使用,一般同步设置的为 0
第三 发送一个请求 获得请求的句柄
HttpOpenRequest – 获得一个句柄
这里可以选择的动作可以是 POST 或者是 Get
然后呢我们可以设置我们 发送的Http 头信息,比如发送一个变量 user 信息在http 头中。
第四 这步是使用 HttpSendRequest 发送一个请求到服务器
发送完毕以后要查询一下状态码,返回 200 为正确 否则为失败
当返回 HTTP_STATUS_DENIED 或者 HTTP_STATUS_PROXY_AUTH_REQ 的时候需要通过代理连接服务器。
然后我们怎么做呢。
1 我们需要把代理服务器返回的信息全部读出来。
2 如果我们在开始的时候设置了代理那么我们需要调用
InternetSetOption
dwOption 选择 INTERNET_OPTION_USERNAME 设置代理服务器的登录用户
然后调用 InternetSetOption
dwOption 选择 INTERNET_OPTION_PASSWORD 设置代理服务器的登录用户名
设置完以后 再次调用第四步发送请求到服务器
如果我们在程序中没有代理的设置,那么我们应该弹出提示
使用 InternetErrorDlg 函数 。
第五 查询返回的头信息
使用 HttpQueryInfo
dwInfoLevel 设置为 HTTP_QUERY_RAW_HEADERS_CRLF
这里服务器可以返回给我们好多的参数
第六 读取服务器的response (响应)
使用 InternetReadFile 读取
第七 最后 关闭 session ,connect, request 句柄
使用 InternetCloseHandle
附代码:
BOOL CXMLTransport::SendDataToServer(
CString strServer,
DWORD dwPort,
CString strObj,
CString strHead,
LPVOID lpData,
DWORD dwDataLen,
LPBYTE &lpRecvBuffer,
DWORD &dwRecvDataLen,
CString &strRetHeadInfo)
{
USES_CONVERSION;
BOOL bError=TRUE;
HINTERNET hOpen =NULL;
HINTERNET hConnect =NULL;
HINTERNET hReq =NULL;
DWORD dwAccType =LOCAL_INTERNET_ACCESS;
TCHAR szAccept[] = _T("*/*");
LPSTR AcceptTypes[2]={0};
DWORD dwCode =0;
CHAR *lpBuffer, szData[1024];
// DWORD dwBufferSize =DATA_BLOCK;
DWORD dwSize=0;
DWORD dwFlags = INTERNET_FLAG_RELOAD |
INTERNET_FLAG_NO_CACHE_WRITE |
INTERNET_FLAG_KEEP_CONNECTION;
BOOL m_bUseProxy=theSysConfig.bIsUseProxyHttp;
BOOL m_bAuth =theSysConfig.bIsUseHttpAuth;
CString m_strProxyServer;
CString m_strProxyUser =theSysConfig.chHttpProxyUser;
CString m_strProxyPWD =theSysConfig.chHttpProxyUser;
m_strProxyServer.Format(_T("http://%s:%ld"),theSysConfig.chHttpProxyName,theSysConfig.dwHttpProxyPort);
dwRecvDataLen =0;
//open....
if(m_bUseProxy)
{
if ( !(hOpen = InternetOpen ( _T("colorme"),
CERN_PROXY_INTERNET_ACCESS, m_strProxyServer, NULL, 0) ) )
{
ErrorOut ( GetLastError(), _T("InternetOpen"));
LogTrace(_T("InternetOpen Errcode=%ld"),GetLastError());
return 0;
}
}
else
{
if ( !(hOpen = InternetOpen (_T("colorme"),
LOCAL_INTERNET_ACCESS , NULL, 0, 0) ) )
{
ErrorOut ( GetLastError(), _T("InternetOpen"));
LogTrace(_T("InternetOpen Errcode=%ld"),GetLastError());
return 0;
}
}
//connect...
if ( !(hConnect = InternetConnect ( hOpen, strServer ,
dwPort, _T(""), _T(""), INTERNET_SERVICE_HTTP, dwPort , 0) ) )
{
ErrorOut (GetLastError(), _T("InternetConnect"));
LogTrace(_T("InternetConnect Errcode=%ld"),GetLastError());
return 0;
}
if ( !(hReq = HttpOpenRequest (hConnect, _T("POST"), strObj,
HTTP_VERSION, _T(""),
(LPCTSTR*) AcceptTypes,
dwFlags ,0 )))
{
ErrorOut (GetLastError(), _T("HttpOpenRequest"));
LogTrace(_T("HttpOpenRequest Errcode=%ld"),GetLastError());
return 0;
}
if ( !HttpAddRequestHeaders (hReq, strHead, strHead.GetLength(), HTTP_ADDREQ_FLAG_ADD))
{
ErrorOut (GetLastError(), _T("HttpSendRequest"));
LogTrace(_T("HttpAddRequestHeaders Errcode=%ld"),GetLastError());
bError=TRUE;
goto RET;
}
again:
do {
if ( !HttpSendRequest (hReq, NULL, 0, lpData, dwDataLen))
{
ErrorOut (GetLastError(), _T("HttpSendRequest"));
LogTrace(_T("HttpSendRequest Errcode=%ld"),GetLastError());
break;
}
dwSize = sizeof (DWORD) ;
if ( !HttpQueryInfo (hReq, HTTP_QUERY_STATUS_CODE |
HTTP_QUERY_FLAG_NUMBER, &dwCode, &dwSize, NULL))
{
ErrorOut (GetLastError(), _T("HttpQueryInfo"));
LogTrace(_T("HttpQueryInfo Errcode=%ld"),GetLastError());
break;
}
bError=FALSE;
} while(FALSE);
//出错则处理错误.
if(bError)
{
goto RET;
}
bError=TRUE;
do {
if ( dwCode == HTTP_STATUS_DENIED || dwCode ==
HTTP_STATUS_PROXY_AUTH_REQ)
{
do
{
InternetReadFile (hReq, (LPVOID)szData, 1000, &dwSize);
}
while (dwSize != 0);
if (m_bAuth) //是否认证
{
if(!SetProxyUserPWD(hConnect,(LPCTSTR)m_strProxyUser,(LPCTSTR)m_strProxyPWD))
{
LogTrace(_T("SetProxyUserPWD Errcode=%ld"),GetLastError());
break;
}
goto again;
}
else
{
if ( InternetErrorDlg (GetDesktopWindow(),
hReq,
ERROR_INTERNET_INCORRECT_PASSWORD,
FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
NULL) == ERROR_INTERNET_FORCE_RETRY)
goto again;
}
}
else
{
if(dwCode!=200)
{
break;
}
}
// First time we will find out the size of the headers.
if(!HttpQueryInfo (hReq,HTTP_QUERY_RAW_HEADERS_CRLF, NULL, &dwSize, NULL))
{
// break;
}
lpBuffer = new char [dwSize + 1 ];
// Now we call HttpQueryInfo again to get the headers.
if (!HttpQueryInfo (hReq,HTTP_QUERY_RAW_HEADERS_CRLF, (LPVOID)
lpBuffer,
&dwSize, NULL))
{
ErrorOut (GetLastError(), _T("HttpQueryInfo"));
LogTrace(_T("HttpQueryInfo Errcode=%ld"),GetLastError());
delete [] lpBuffer;
break;
}
strRetHeadInfo=(TCHAR*)lpBuffer;
delete [] lpBuffer;
//读取RESPONSE.
if(!ReadResponse(hReq,lpRecvBuffer,dwRecvDataLen))
{
LogTrace(_T("ReadResponse Errcode=%ld"),GetLastError());
break;
}
bError=FALSE;
} while(FALSE);
//处理清除工作
RET:
SECURITY_CLOSE(hReq);
SECURITY_CLOSE(hConnect);
SECURITY_CLOSE(hOpen);
return !bError;
}