VC實現單向認證SSL連接POST數據源碼

(作者:陳波,2012-03-05,轉載請註明 Form:http://blog.csdn.net/jinhill/article/details/7321515)
#include "StdAfx.h"
#include <afxinet.h>

CInternetSession *g_ISession;
CHttpConnection *g_pHttpConn = NULL;
CHttpFile *g_pHttpFile = NULL;
const char g_szHeaders[]=_T("Accept: */*\r\nUser-Agent:Jinhill Http Agent\r\nContent-Type: application/x-www-form-urlencoded");
int g_nHeaderLen = strlen(g_szHeaders);

int  HttpConnect(char *szURL)
{
	if(szURL == NULL)
	{
		return -1;
	}
	CString strServerName = "localhost";
	CString strObject = "/";
	INTERNET_PORT nPort = 443;
	DWORD dwServiceType = 0;
	DWORD dwReqFlags = 0;
	BOOL bRV = AfxParseURL(szURL,
						dwServiceType,
						strServerName,
						strObject,
						nPort );
	if (!bRV) 
	{ 
		return -2; 
	}

	try
	{
		g_ISession = new  CInternetSession();
		g_pHttpConn = g_ISession->GetHttpConnection(strServerName, INTERNET_FLAG_SECURE | SECURITY_FLAG_IGNORE_UNKNOWN_CA, nPort); 
		g_pHttpFile = g_pHttpConn->OpenRequest(CHttpConnection::HTTP_VERB_POST, 
			strObject, NULL, 1, NULL, NULL,INTERNET_FLAG_SECURE);
		g_pHttpFile->AddRequestHeaders(g_szHeaders);
		dwReqFlags = SECURITY_FLAG_IGNORE_CERT_CN_INVALID  | SECURITY_FLAG_IGNORE_CERT_DATE_INVALID | SECURITY_FLAG_IGNORE_UNKNOWN_CA | SECURITY_FLAG_IGNORE_REVOCATION | SECURITY_FLAG_IGNORE_WRONG_USAGE;
		g_pHttpFile->SetOption(INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwReqFlags, sizeof(dwReqFlags));
	}
	catch(CInternetException*)
	{
		if(g_pHttpFile)
		{
			g_pHttpFile->Close();
			g_pHttpFile = NULL;
		}
		if (g_pHttpConn != NULL) 
		{
			g_pHttpConn->Close();
			delete g_pHttpConn;
		}
		return -3; 
	}
	return 0;
}
////////////////////////////////////////////////////////////////////////////////////
int   SendData(char *pbData, DWORD dwLen)
{
	if(g_pHttpConn == NULL ||
		g_pHttpFile == NULL ||
		pbData == NULL ||
		dwLen <= 0 )
	{
		return -1;
	}
	try
	{
		BOOL bRV = g_pHttpFile->SendRequest(g_szHeaders, g_nHeaderLen, pbData, dwLen); 
		if(!bRV)
		{
			return -4;
		}
	}
	catch(CInternetException*)
	{
		return -3;
	}
	return 0;
}

int   ReadData(char *pbData, DWORD dwLen)
{
	if(g_pHttpConn == NULL ||
		g_pHttpFile == NULL ||
		pbData == NULL ||
		dwLen <= 0 )
	{
		return -1;
	}
	int nReadLen = 0;
	try
	{
		nReadLen = g_pHttpFile->Read(pbData, dwLen);
	}
	catch(CInternetException*)
	{
		return -3;
	}
	return nReadLen;
}

void   HttpClose()
{
	if(g_pHttpFile)
	{
		g_pHttpFile->Close();
		g_pHttpFile = NULL;
	}
	if(g_pHttpConn)
	{
		g_pHttpConn->Close();
		g_pHttpConn = NULL;
	}
	if(g_ISession)
	{
		g_ISession->Close();
		delete g_ISession;
	}
}
////////////////////////////////////////////////////////////////////////////////////
void CTestHttpsDlg::OnOK() 
{
	int rv = -1;
	char pbSendData[1024] = "flag=sign&a=1&b=2";
	int nSendLen = strlen(pbSendData);
	char pbRecvData[1024] = {0};
	int nRecvLen = sizeof(pbRecvData);
	int nLen = 0;
	rv = HttpConnect("https://10.0.89.12/test.jsp");
	if( rv != 0)
	{
		return;
	}
	rv = SendData(pbSendData, nSendLen);
	if( rv != 0)
	{
		return;
	}
	while(1)
	{
		rv = ReadData(pbRecvData, nRecvLen);
		if( rv <= 0)
		{
			break;
		}
		OutputDebugString(pbRecvData);
	}

	strcpy(pbSendData, "flag=check&a=4&b=5");
	rv = SendData(pbSendData, nSendLen);
	if( rv != 0)
	{
		return;
	}
	while(1)
	{
		rv = ReadData(pbRecvData, nRecvLen);
		if( rv <= 0)
		{
			break;
		}
		OutputDebugString(pbRecvData);
	}
      HttpClose();
}

發佈了154 篇原創文章 · 獲贊 9 · 訪問量 108萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章