Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果使用SSL_set_bio(),SSL_free()将崩溃_C++_Windows_Https_Openssl - Fatal编程技术网

C++ 如果使用SSL_set_bio(),SSL_free()将崩溃

C++ 如果使用SSL_set_bio(),SSL_free()将崩溃,c++,windows,https,openssl,C++,Windows,Https,Openssl,我尝试过简单的https客户端。下面是我的代码 WSADATA wsaData = {0}; int res = WSAStartup(MAKEWORD(2,2), &wsaData); if(NO_ERROR != res) { return false; } SOCKET client = WSASocket(AF_INET, SOCK_STREAM, 0/*IPPROTO_IP*/, NULL, 0, WSA_FLAG_OVERLAPPED); struct hoste

我尝试过简单的https客户端。下面是我的代码

WSADATA wsaData = {0};
int res = WSAStartup(MAKEWORD(2,2), &wsaData);
if(NO_ERROR != res) 
{
    return false;
}
SOCKET client = WSASocket(AF_INET, SOCK_STREAM, 0/*IPPROTO_IP*/, NULL, 0, WSA_FLAG_OVERLAPPED);

struct hostent *pHost = NULL;
pHost = gethostbyname("www.google.com");

if (pHost == NULL)
{
    return -1;
}

struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_port = htons(443);
CopyMemory(&address.sin_addr, pHost->h_addr_list[0], pHost->h_length);

int ret = 0;

ret = connect(client, (struct sockaddr*)&address, sizeof(address));
if ((SOCKET_ERROR == ret) && (WSA_IO_PENDING != WSAGetLastError())) 
{
    return -1;
}

CRYPTO_malloc_init(); // Initialize malloc, free, etc for OpenSSL's use
if(SSL_library_init())
{
    // Initialize OpenSSL's SSL libraries
    SSL_load_error_strings(); // Load SSL error strings
    ERR_load_crypto_strings();
    ERR_load_SSL_strings();
    ERR_load_BIO_strings(); // Load BIO error strings

    OpenSSL_add_all_algorithms();
}

SSL_CTX *clientCtx = SSL_CTX_new(TLSv1_client_method());
SSL_CTX_set_verify(clientCtx, SSL_VERIFY_NONE, NULL);
SSL* clientSSL = SSL_new(clientCtx);
SSL_set_fd(clientSSL, client);
SSL_set_cipher_list(clientSSL, "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL");
SSL_set_tlsext_host_name(clientSSL, "www.google.com");

ret = SSL_connect(clientSSL);
if(ret != 1)
{
    char buf[120];
    int res = SSL_get_error(clientSSL, ret);
    ERR_error_string(res, buf);
    return -1;
}
else
{
    BIO *inBio = BIO_new(BIO_s_mem());
    BIO *outBio = BIO_new(BIO_s_mem());
    SSL_set_bio(clientSSL, inBio, outBio);

    SSL_shutdown(clientSSL);
    SSL_free(clientSSL); //Code crashes here.
    if(clientCtx)
    {
        SSL_CTX_free(clientCtx);
        clientCtx = NULL;
    }   
    return 0;
}

在这里,如果在SSL\u set\u Bio之前调用SSL\u shutdownclientSSL和SSL\u freeclientSSL,则不会崩溃。为什么SSL_免费崩溃?在调用SSL_free之前,我们还需要做些什么吗?我正在windows中使用Openssl 1.0.1L。

我为visual studio 2010构建了Openssl 1.0.1L,并将其包含在一个静态库中,现在该代码可以正常工作

PS:我使用的是openssl中预构建的.lib文件