MENU

标签 摸爬滚打C++之路 下的文章

linux进程通信eventfd

前言

在muduo网络应用框架中EventLoop类中学习到关于eventfd,所以系统性查找资料学习有关eventfd。

知识点

eventfd通过一个进程间共享的64位计数器来实现进程间的通信,基于事件驱动实现的轻量级进程间通信的系统调用。

int eventfd(unsigned int initval, int flags);
# 返回一个新的文件描述符,该描述符可以用于引用eventfd对象。

阅读全文

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。下面总结下这四个指针的区别。

阅读全文

基于Linux EPOLL多路复用的C++轻量级WebServer

功能

  • 可作为静态webserver(常规的html、图片、视频等)
  • 支持GET、POST(交由cgi处理)请求
  • 多站点支持
  • 支持fastcgi(目前已支持php-fpm)
  • 支持反向代理
  • 支持session、cookie

todo:

  • 负载均衡(开发中,完善支持随机模式、hash模式、权重模式三种负载均衡策略)
  • 日志完善
  • 实现类似nginx中rewrite模块

项目地址 欢迎PR、Issue、Star。

阅读全文

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