MENU

分类 摸爬滚打 C++ 之路 下的文章

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处理。

阅读全文

GCC4.8使用regex坑

背景

最近在写C++的webserver,其中的有一块需要用到正则表达式,而系统centos7自带的GCC编译器的版本gcc 版本 4.8.5,在make编译时候出现std::regex_error::regex_error,一开始怀疑正则问题,使用网页版的正则表达式工具review确实是正确的,后面有在思考是否为编译器版本问题,强大的搜索引擎告诉我确实为版本的原因,regex标准库需要GCC大于等于4.9版本。

阅读全文

socket编程Transport endpoint is not connected错误总结

前言

最近使用C++网络编程,计划实现一个web服务(模拟http请求、支持host模式)。刚接触犯了一个低级的通信错误,导致Transport endpoint is not connected。

原因分析

在server端accept一个新的连接后返回一个文件描述符(这里就叫connect_fd),但这个文件描述符有区别于初始化socket的listen_fd文件描述符。在read函数的时候错误将listen_fd传入到函数中,最终导致Transport endpoint is not connected错误。

# read读取数据过程
while(true){
    if((nread = read(connect_fd, ptr, nleft)) < 0){
    
    }
}

# accept函数 使用的是
int accept(int listen_fd, struct sockaddr *cliaddr, socklen_t *addrlen);

Linux下系统调用

知识点

操作系统的进程空间有用户态系统态,它们具有不同的执行权限。系统调用是指运行在用户态的进程向操作系统内核态请求获得更高的运行权限而能够受限访问硬件设备(比如CPU、打印机)。

当发生系统调用时,CPU通过软中断切换到内核态开始执行内核系统调用函数。

阅读全文

sizeof知识点

前言

最近在学习C++知识,记录下一些常考的知识点。

sizeof空类

sizeof空类为1,是为了确保两个不同对象的地址的不同。

#include<iostream>

using namespace std;

class Empty{};

int main(){
    # 输出为1
    cout << sizeof(Empty) << endl;
    return 0;
}

sizeof虚函数

不管包含有多少个虚函数,只有一个虚指针vptr的大小。

#include<iostream>

using namespace std;

class VirtualFunction{
    virtual void funtion1();
    virtual void funtion2();
    virtual void funtion3();
};

int main(){
    # 输出为8
    cout << sizeof(VirtualFunction) << endl;
    return 0;
}