使用openssl实现
编译
- win下直接点击下载选择 Win64 OpenSSL v1.1.1b 反正不能light
- 安装后在vs设置:
-
包含目录:C:\Program Files\OpenSSL-Win64\lib
-
库目录:C:\Program Files\OpenSSL-Win64\include
-
链接器输入:libssl.lib libcrypto.lib
-
新库例行的Hello world
在网上看了不少最后还是回到书才看懂
出自《http权威指南》p347-349
Sion的改变
Sion也就这个库的名字,可以解释为simply input output network?
对于sion在http的时候就已经做了很多工作,所以需要改的地方不多
//http的send
void Send(Socket socket)
{
send(socket, Source.c_str(), int(Source.length()), 0);
}
//https的send
Response SendBySSL(Socket socket)
{
auto err = [this](MyString msg)
{
throw std::exception(msg.c_str());
};
SSL_library_init();
auto method = TLSv1_1_client_method();
auto context = SSL_CTX_new(method);
auto ssl=SSL_new(context);
SSL_set_fd(ssl, socket);
SSL_connect(ssl);
SSL_write(ssl, Source.c_str(), Source.length());
auto resp = ReadResponse(socket, ssl);
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(context);
return resp;
}
在接收响应上也只不过改下lambda
auto Read = [socket,&buf,this,&ssl]()
{
int num = 0;
auto protocol = url.GetProtocol();
if (protocol== ProtocolEnum::http)
{
num=recv(socket, buf, sizeof(buf) - 1, 0);
}
else if(protocol== ProtocolEnum::https)
{
num= SSL_read(ssl, buf, sizeof(buf) - 1);
}
if (num < 0)
{
MyString Msg = "网络异常,Socket错误码:" + std::to_string(num);
throw std::exception(Msg.c_str());
}
};