我尝试过简单的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_set_Bio()之前调用SSL_shutdown(clientSSL)和SSL_free(clientSSL),它不会崩溃。为什么SSL_free会崩溃?在调用SSL_free()之前我们还做了什么吗?我在Windows中使用Openssl 1.0.1L。
答案 0 :(得分:0)
我为visual studio 2010构建了openssl 1.0.1L,并将其包含在静态库中,现在这段代码可以运行。
PS:我使用的是openssl中预先构建的.lib文件。