从socket开始实现服务器及HttpClient[3] SSL支持

使用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
从socket开始实现服务器及HttpClient[3] SSL支持_第1张图片从socket开始实现服务器及HttpClient[3] SSL支持_第2张图片
从socket开始实现服务器及HttpClient[3] SSL支持_第3张图片

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());
				}
			};

最后

从socket开始实现服务器及HttpClient[3] SSL支持_第4张图片
惯例求个Star,Github在此,Master上都是可以使用的,开发在其它分支

你可能感兴趣的:(HTTP,c++)