欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于OpenSSL的一些问题的补充

程序员文章站 2024-03-14 18:14:22
...

 【1】warning C4150: 删除指向不完整“ssl_ctx_st”类型的指针;没有调用析构函数

SSL_CTX *ctx;  

 SSL *ssl;

delete ssl;

delete ctx;

ctx 和 ssl 是不能直接用delete释放内存的,析构函数对调用的类是不可见的,必须以如下方式释放内存:

SSL_shutdown(ssl);

SSL_free(ssl);

SSL_CTX_free(ctx);

 

【2】warning C4251: “CSSLPort::m_clsSSLVec”: class“std::vector<_Ty>”需要有 dll 接口由 class "CSSLPort"的客户端使用

std::vector<CSSLPortMeta *> *m_pclsSSLVec;

其中class CSSLPortMeta 定义如下:
.h
class COMMUNICATION_API CSSLPortMeta
{
public:
	SOCKET m_hSocket;
	SSL *m_pSSL;

public:
	CSSLPortMeta(void);
	virtual ~CSSLPortMeta(void);

	void SetData(SOCKET socket, SSL *ssl);
};


.cpp
CSSLPortMeta::CSSLPortMeta(void)
{
	m_pSSL = NULL;
} 

CSSLPortMeta:: ~CSSLPortMeta(void)
{
	if(m_pSSL!=NULL)
	{
		SSL_shutdown(m_pSSL);
		SSL_free(m_pSSL);
	}
}

void CSSLPortMeta::SetData(SOCKET socket, SSL *ssl)
{
	m_hSocket = socket;
	m_pSSL = ssl;
}

1、第一种: 无视它或者#pragma warnind( disable: 4251 );(不推荐)

2、第二种:改成指针类型

std::vector<CSSLPortMeta *> *m_pclsSSLVec;

初始化:
m_pclsSSLVec = new std::vector<CSSLPortMeta *>;


释放内存:
size_t nCount = m_pclsSSLVec->size();
for(size_t i=0; i<nCount; i++)
{
    CSSLPortMeta *pData = (*m_pclsSSLVec)[i];
    if(pData!=NULL)
	delete pData;
}

m_pclsSSLVec->clear();
delete m_pclsSSLVec;

 还有其他方式,这里就不介绍了,没试过。

 

【3】自己写的dll想要引入OpenSSL,程序运行时出现报错:无法识别#include <OpenSSL/ssl.h>

新建一个Win32应用程序OpenSSL,应用程序类型选择DLL,点击完成。将所有需要的OpenSSL相关头文件导入,然后给自己写的dll添加项目依赖项OpenSSL, 代码的前面添加#pragma comment(lib, "OpenSSL.lib"),然后如我的第一篇文章所写的那样导入相关lib文件和dll文件即可。

关于OpenSSL的一些问题的补充

 

相关标签: Visual Studio SSL