C++实现用OpenSSL访问WEB并可以recv超时

本文介绍了如何在C++中利用OpenSSL库实现对HTTPS网站的访问,并设置了recv超时功能。适合需要在不支持Python的环境中进行批量请求的场景。
摘要由CSDN通过智能技术生成

最近要实现一个批量请求不同网站的工具,本想用socket直接实现得了,但遇到https的站就傻了眼,因为要到其他一些机器上运行所以就不考虑用Python去实现了,找来找去还是决定用C++的OpenSSL库来实现它。


MySSL.h文件:

#include <openssl/ssl.h>

#include <algorithm>  //transform
#include <string>
using namespace std;

#pragma comment(lib, "libeay32.lib")
#pragma comment(lib, "ssleay32.lib")

#define MAXHEADERSIZE MAX_PATH*10

#define MUTEX_TYPE HANDLE

typedef unsigned long (*ID_FUNC)(void);
typedef void (*LOCK_FUNC)(int,int,const char*,int);

class CMySSL  
{
public:
	//static void SetFakeRange(string fakeRange);
	BOOL IsSSL();
	int GetConnectPort();
	string GetConnectIP();
	void CancelTest();
	
	static int THREAD_cleanup(MUTEX_TYPE *hMutexBuf);
	static MUTEX_TYPE* THREAD_setup(ID_FUNC id_func,LOCK_FUNC lock_func);
	static BOOL CompareNoCase(const string &strA,const string &strB);
	void CloseConnect();
	string FormatRequestHeaders(string szHost,string szObject,string szDataBuf="",string szCookies="",string szReferer="",
								string szConnection="Close",string szCharset="",long nFrom=0,long nTo=0);
	BOOL SetIpAndPort(string strIP,int nPort);
	string GetLastError();
	string GetAllHeaders();
	string GetCookiesValue(string FieldName);
	BOOL SetCookies(string CookiesBuf);
	string GetCookies();
	string GetHeaderField(string FieldName);
	BOOL SetHeaderField(string FieldName,string FieldValue);
	int GetResponseCode();
	DWORD GetSize();
	int GetResponse(char *buf,int nSize);
	string GetResponse(DWORD dwSize=0);
	BOOL SendRequest(int dwTimeout=10);
	BOOL InitSSL(string TargetUrl,string data="",int Type=0);
	CMySSL();
	virtual ~CMySSL();

protected:
	//string m_szFakeIP;
	DWORD GetRandNumber(DWORD dwMin=2,DWORD dwMax=250);
	//BOOL doFake(string szIpRange="");   //这个相关功能代码就不贴了

	int m_RetryCount;
	virtual int doConnect(string szHost,int nPort,int nTimeout);
	virtual int RecvData(void *Buf,size_t len,int nTimeout=15);
	virtual int SendData(void *Buf,size_t len,int nTimeout=15);
	BOOL m_bSSL;
	BOOL m_bRecvHeader;
	BOOL m_bConnected;
	DWORD m_HtmlLength;
	string ResolveHost(string szHost);
	string m_Path;
	BOOL SplitHostAndPath(string strUrl);

	SSL *m_sslObj;
	SSL_CTX *m_ctxObj;
	int	m_Sockfd;

	string m_Host;
	int m_Port;
	string m_IP;
	string m_LastErrorStr;
	string RecvAllHeaders();
	string m_Cookies;
	string m_RecvHeaderBuf;
	string m_SendHeaderBuf;
	DWORD m_ResponseSize;
};


MySSL.cpp文件:

#include "stdafx.h"
#include "MySSL.h"

#define NOCONNECTION "Connection is not established."

//static string m_FakeRange = "";
//static BOOL   m_bFake = FALSE;

CMySSL::CMySSL()
{
	//ERR_load_BIO_strings();
	//SSL_load_error_strings();
	//SSLeay_add_ssl_algorithms();

	m_sslObj = NULL;
	m_ctxObj = NULL;
	m_Sockfd = INVALID_SOCKET;

	m_bConnected = FALSE;
	m_bRecvHeader = FALSE;
	m_bSSL = FALSE;
	m_Cookies = "";

	m_RetryCount = 2;

}

CMySSL::~CMySSL()
{
        CloseConnect();
}

BOOL CMySSL::InitSSL(string TargetUrl,string data,int Type) //Can use http
{

/***********Init*****************/
	m_sslObj = NULL;
	m_ctxObj = NULL;
	m_Sockfd = INVALID_SOCKET;
	
	CloseConnect();
	
	m_bConnected = FALSE;
	m_bRecvHeader = FALSE;
	m_bSSL = FALSE;
	m_Cookies = "";
	m_RetryCount = 2;
/***********************************/

	if(CompareNoCase(TargetUrl.substr(0,6),"https:"))
		m_bSSL = TRUE;

	if(!SplitHostAndPath(TargetUrl)){
		m_LastErrorStr = "Url is error.";
		return FALSE;
	}

	m_IP=ResolveHost(m_Host);
	if(m_IP.compare("127.0.0.1")==0){
		m_LastErrorStr = "Resolve host to ip failed.";
		return FALSE;
	}

	m_SendHeaderBuf=Fo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值