0%

使用Epoll和协程处理链接的socket库

使用epoll和协程处理信息的socket通信库

  • github链接
  • 详细文档见readme
  • 底层是ucontextepoll
  • 提供一个EpollServer
  • 基于上一个协程库进行了面向对象的重构实现

    结构

  • 创建一个服务器socket
  • 使用epoll检测每个事件
  • 检测到新的客户端连接的时候,给对应的线程置一个flag,提示这个线程需要创建一个新的协程处理客户端链接的问题
  • 新的协程自己在线程内创建协程(最好在同一个线程内创建和使用协程,否则会导致容易产生segmentation fault
  • 创建之后将协程状态设置为suspend
  • 等待epoll接收到信号之后,通过一个哈希映射将对应的协程状态设置为runnable提示该协程的调度器可以上处理机运行
  • 然后对应的线程将协程调度上处理及,协程处理完之后会继续将自己设置为suspend状态并且下处理机,等待epoll激活自己
  • 增加了定时器的功能,防止协程在睡眠的时候阻塞,提高时间利用率
  • picture 3

在命令行输出有颜色和格式的字符

\033[0m  # 重置所有属性
\033[1m # 加粗
\033[4m # 下划线
\033[5m # 闪烁
\033[7m # 反显
\033[8m # 隐藏
\033[30m # 黑色字体
\033[31m # 红色字体
\033[32m # 绿色字体
\033[33m # 黄色字体
\033[34m # 蓝色字体
\033[35m # 洋红色字体
\033[36m # 青色字体
\033[37m # 白色字体
\033[40m # 黑色背景
\033[41m # 红色背景
\033[42m # 绿色背景
\033[43m # 黄色背景
\033[44m # 蓝色背景
\033[45m # 洋红色背景
\033[46m # 青色背景
\033[47m # 白色背景
\033[100m # 灰色背景
  • 红色字:echo -e "\033[31mHello, World!\033[0m"
  • 加粗、下划线、红色字体echo -e "\033[1;4;31mHello, World!\033[0m"

    使用

    EpollServer ep(<线程数>, <端口号>);
  • 头文件是epollServer.h
  • 测试文件是client.cpp
  • 编译指令g++ cothread.cpp main2.cpp epollServer.cpp -o test1 -lpthread -g

输出

  • picture 0
  • picture 1