string CNet::GetUrlHost(string strUrl)
{
string strRtn;
if(strUrl.empty())
return "";
int length = strUrl.length();
int i=0;
int j=0;
for(;i<length;i++)
{
if(strUrl.at(i) == '/')
{
j++;
}
if(j == 3)
break;
}
strRtn = strUrl.substr(0,i);
length = strRtn.length();
int rPos = strRtn.rfind('/');
strRtn = strRtn.substr(rPos+1,length);
return strRtn;
}
string CNet::GetUrlOther(string strUrl)
{
string strRtn;
if(strUrl.empty())
return "";
int length = strUrl.length();
int i=0;
int j=0;
for(;i<length;i++)
{
if(strUrl.at(i) == '/')
{
j++;
}
if(j == 3)
break;
}
strRtn = strUrl.substr(i,length);
return strRtn;
}
void CNet::GetHttp(string strUrl,string strPost,BOOL bIsShow,BOOL bIsKeepAlive)
{
OutputDebugString(_T("http開始了!"));
if(strUrl.empty())
{
cout<<"輸入的url爲空!"<<endl;
return;
}
HINTERNET hInternet = InternetOpen( _T("Testing"),
INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,NULL, NULL, 0 ); //初始化WinINet
if(hInternet == NULL)
{
cout<<"WinINet初始化失敗!"<<endl;
return;
}
string strCntName = GetUrlHost(strUrl);
HINTERNET hConnect = InternetConnect(hInternet, stringToLPCWSTR(strCntName), INTERNET_DEFAULT_HTTP_PORT,
NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); //連接服務器
if(hConnect == NULL)
{
cout<<"連接服務器失敗!"<<endl;
InternetCloseHandle(hInternet);
return;
}
string strOther = GetUrlOther(strUrl);
strOther.append("\r\n");
HINTERNET hOpenRequest;
if(strPost.empty())
{
hOpenRequest = HttpOpenRequestA(hConnect, "GET",strOther.c_str() , ("HTTP/1.1"), NULL,
(LPCSTR*)"*/*", INTERNET_FLAG_DONT_CACHE, 1); //創建http請求 post
}
else
{
hOpenRequest = HttpOpenRequestA(hConnect, "POST",strOther.c_str() , ("HTTP/1.1"), NULL,
(LPCSTR*)"*/*", INTERNET_FLAG_DONT_CACHE, 1); //創建http請求 post
}
if(hOpenRequest == NULL)
{
cout<<"創建http請求失敗!"<<endl;
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
return;
}
//添加請求頭信息,keepalive "Connection: keep-alive"
//長連接
if(bIsKeepAlive == TRUE)
{
LPCSTR header= "Connection: keep-alive/r/n";
SIZE_T len = strlen(header);
HttpAddRequestHeadersA(hOpenRequest,header,len,NULL);
}
BOOL bRequest;
if(strPost.empty())
{
bRequest = HttpSendRequestA( hOpenRequest, NULL,0, NULL,0);
}
else
{
//post 發送數據
DWORD dwSize = (strPost.empty()) ? 0 : strlen(strPost.c_str());
bRequest = HttpSendRequestA( hOpenRequest, NULL,0, (LPVOID)strPost.c_str(),dwSize); //發送http請求
}
int n = GetLastError();
if(bRequest == FALSE)
{
cout<<"發送http請求失敗!"<<endl;
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
InternetCloseHandle(hOpenRequest);
return;
}
char szBuffer[1024] = {0};
DWORD dwByteRead = 0;
while (InternetReadFile(hOpenRequest, szBuffer, sizeof(szBuffer), &dwByteRead) && dwByteRead > 0)
{
if(bIsShow == TRUE)
{
cout<<szBuffer<<endl;
ZeroMemory(szBuffer, dwByteRead);
}
}
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
InternetCloseHandle(hOpenRequest);
OutputDebugString(_T("http結束了!"));
}
這裏實現了get方法和post方法,post方法可以提交數據,strPost代表的提交的數據,通過wireshark抓包分析可知,
數據上傳成功,get方法下實現了keepalive(原理是對請求頭添加信息 keepalive\r\n,可以開啓長連接,當然是否開啓成功還是要看服務器是否支持)