MENU

C++ explicit 关键字

知识点

explicit用来声明类构造函数的显示调用,当然这个作用是针对单参数构造函数

示例

#include <iostream>

class ExplicitTest {
public:
    // 无参构造函数不能隐式调用
    ExplicitTest() {
        std::cout << "这是无参构造函数" << std::endl;
    }

    explicit ExplicitTest(int num) {
        std::cout << "这是int参数构造函数" << num << std::endl;
    }

    explicit ExplicitTest(char *str) {
        std::cout << "这是char参数构造函数" << str << std::endl;
    }

    // 多参数构造函数不能隐式调用
    ExplicitTest(int num, char *str) {
        std::cout << "这是多参数构造函数" << num << str << std::endl;
    }
};

int main(int argc, char *argv[]) {

    ExplicitTest explicitTest1(5);
//    ExplicitTest explicitTest2 = 5;  有explicit关键字无法隐式调用
    ExplicitTest explicitTest3("hello world");
//    ExplicitTest explicitTest4 = "hello world"; 有explicit关键字无法隐式调用

    return 0;
}

C++11新特性之智能指针

前言

C/C++不像Java那样JVM有垃圾回收机制,需要使用者mallocnew分配内存,freedelete释放内存。一旦忘记释放内存,则会出现内存泄露问题。
在C++11标准中新增unique_ptrshared_ptrweak_ptr这三个智能指针来自动回收堆分配的对象。C++98中的auto_ptr也置为deprecated。下面总结下这四个指针的区别。

阅读全文

Centos7安装OpenSSL小记

前言

最近给博客网站nginx编译支持TLS1.3协议,TLS1.3在加密上有所提升,还有一点是握手过程中,第一次握手只需要一个RTT而第二次访问则是0-RTT,因此特意去升级尝鲜。由于TLS1.3还需要OpenSSL1.1.1以上的版本,而系统自带OpenSSL是1.1.0版本。

安装

# gcc编译工具
yum install gcc -y

# 源码下载
wget https://github.com/openssl/openssl/archive/OpenSSL_1_1_1g.tar.gz
tar zxvf OpenSSL_1_1_1g.tar.gz

# 配置
cd openssl-OpenSSL_1_1_1g
./config --prefix=/usr

# 编译安装
make
ldconfig

# 验证版本
openssl version  

nginx部分

  • 编译
# nginx configure时候加入以下支持TLS1.3
--with-openssl=/usr/bin/openssl --with-openssl-opt=enable-tls1_3
  • SSL证书配置
# 添加TLSv1.3
ssl_protocols  TLSv1.2 TLSv1.3;  
# 加入TLS1.3引入的新算法
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

可以在Console控制台看到使用TLS1.3

或者使用shell中检查(以下两个命令均可验证)

curl -Ivvv --tlsv1.3 https://icharle.com
openssl s_client  -connect icharle.com:443 -state

Logrotate日志切割

前言

最近将docker上的nginx服务完善添加日志的切割,之前一直是一个文件时间久了出现体积过大,而且不利于查看访问情况(比如每个小时情况、每天的情况等)

阅读全文

FastCGI协议

前言

最近采用C++开发一个webserver,功能类似于nginx。支持其中的多站点host、反向代理、负载均衡、支持cgi、支持session、cookie。支持FastCGI,类似nginx可以监听9000端口连接php-fpm,因此查资料找相关FastCGI协议相关。

CGI及FastCGI相关知识点

  • CGI(common gateway interface)通常翻译为共同网关接口:是Web Server与后台编程语言交互的一种协议。但是CGI有一个致命的缺点,就是每处理一个请求度需要fork一个进程,不断地fork是一项很消耗时间和资源的工作,这样低效的方式明显不能满足需求。
  • FastCGI是一个常驻型的CGI,可以一直执行,只要激活后,不会每次都花时间去fork一次,而且还支持分布式运算。

学习过PHP的童鞋都知道在PHP有个叫php-fpm,它是FastCGI在PHP中的一种实现。我们常常在nginx中配置fastpass 127.0.0.1:9000,其实nginx将动态语言交由PHP处理。

阅读全文