MENU

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

C++ socket编程常用函数

前言

将最近经常使用到的常见socket编程函数做一个笔记记录。

socket

创建进程的套接字描述符。

int socket(int domain, int type, int protocol);

domain:协议族,常用的AF_INET(对应ipv4地址)、AF_INET6(对应ipv6地址)。
type:socket类型,常用的面向连接的流式Socket(SOCK_STREAM)即TCP连接,面向数据报的Socket(SOCK_DGRAM)即UDP连接。
protocol:指定协议,常用的协议IPPROTO_TCP(TCP传输)IPPROTO_UDP(UDP传输)。该protocol与type需要对应,即不能socket类型为UDP而协议为TCP。一般情况下该参数填为0自动使用socket类型的协议。

阅读全文

负载均衡之加权轮询调度算法

前言

WRR(Weighted Round Robin)基于权重轮询调度算法。
过去只是在nginx上直接使用,由于最近在自行开发一个webserver,涉及到一个负载均衡功能,因此自行实现基于权重轮询调度算法。

分析

假设有三台服务器(IP 端口 权重)分别为如下:

  • 服务器A:10.1.1.92:8081 weight:5
  • 服务器B:10.1.1.93:8081 weight: 1
  • 服务器C:10.1.1.94:8081 weight: 1

阅读全文

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。

阅读全文