当前位置: 代码迷 >> 综合 >> 关于OpenSSL的一些问题的补充
  详细解决方案

关于OpenSSL的一些问题的补充

热度:85   发布时间:2024-02-06 21:48:53.0

 【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文件即可。