tinyWebServer
2021-09-18 21:04:17 5 举报
tinywebServer 为了自己方便理解
作者其他创作
大纲/内容
http_conn
+ int m_state //读0写1+ enum METHOD+ enum CHECK_STATE+ enum HTTP_CODE+ enum LINE_STATUS+ MYSQL *mysql // 负责sql连接- char m_read_buf //使用recv读到该buf中- char m_read_idx //记录已经处理到哪一行了- int m_start_line; // 行- char m_write_buf // 组合结构体的写buf- int m_write_idx; //写idx- CHECK_STATE m_check_state //状态机标示- char m_real_file - struct iovec m_iv[2]- int bytes_to_send;- int bytes_have_send
将连接的用户加入users中,将该连接加入到时间队列中,如果长时间没有连接会被踢出去
在子线程中处理request
信号量控制可用连接数
connection_pool 数据库连接池
int m_MaxConn 最大连接数 int m_CurConn 已使用的连接数 int m_FreeConn 空闲的连接数 locker lock; 读写池的锁 list<MYSQL *> connList; 连接池 sem reserve; 控制连接池的信号量string m_url; 主机地址 string m_Port; 数据库端口号 string m_User; 登陆数据库用户名 string m_PassWord;数据库密码 string m_DatabaseName; 库名 int m_close_log; //日志开关
connfd(accept) 监听读写信号
util_timer()
time_t expire; // 超时时间void (* cb_func)(client_data *); // 回调函数client_data *user_data; // 连接资源util_timer *prev; // 前向定时器util_timer *next; // 后继定时器
线程锁控制对于数据库池访问
信号量
连接的获取和释放
client_data
sockaddr_in address; int sockfd; util_timer *timer;
主线程不断监听可能的信号:新客户连接,旧客户的请求,超时信号
pipfd
threadpool<T>
int m_thread_number; //线程池中的线程数 int m_max_requests; //请求队列中允许的最大请求数 pthread_t *m_threads; //描述线程池的数组,其大小为m_thread_number std::list<T *> m_workqueue; //请求队列 locker m_queuelocker; //保护请求队列的互斥锁 sem m_queuestat; //是否有任务需要处理 connection_pool *m_connPool; //数据库 int m_actor_model; //模型切换
char* m_file_addressmmap之后的指针
控制对于请求队列的访问
epoll_evetn events[MAX]结构体中包含具体事件和触发事件的结构体中有fd信息,可以用来控制最大连接数
connectionRAII:数据库连接池RAII
- MYSQL *conRAII;- connection_pool *poolRAII;
日志系统
connfd
client_data*users_timer用来记录每个timer的定时时间,connfd, address信息
list<MYSQL*> connList 数据库连接池
epoll
listenfd监听新连接
客户端请求的响应,使用异步模式,会将请求放进请求队列中,并通过信号量通知线程池中的工作线程,工作线程会一直等待请求队列
日志系统分为同步和异步两种,对于同步每次就直接写入,对于异步,创建单独的日志线程采用阻塞队列的形式写,其中对于队列的读写需要获得锁,然后使用条件变量cond来将线程挂起,直到有资源或者,或者时间到了才去处理
listenfd
run中来获取数据库连接,并写入数据库
收到读写请求,会将请求append到请求队列中
webserver.h
int m_pipefd[2]; 和时间信号相关的操作 int m_epollfd; http_conn *users; //数据库相关 connection_pool *m_connPool; ... //线程池相关 threadpool<http_conn> *m_pool; int m_thread_num; //epoll_event相关 epoll_event events[MAX_EVENT_NUMBER]; int m_listenfd; int m_OPT_LINGER; int m_TRIGMode; int m_LISTENTrigmode; int m_CONNTrigmode; //定时器相关 client_data *users_timer; Utils utils;
http_conn*users连接用户数组
为每个fd设置一个timer链表链表按照超时时间向后排列
sort_timer_lst:timer链表
- util_timer *head;- util_timer *tail;
locker
pthread_mutex_t m_mutex; 线程锁
loker();获取线程锁bool lock() 加锁bool unlock() 解锁pthread_mutext_t* get()获取线程锁地址!locker() 摧毁线程锁
超时信号,会去检查队列中是否有超时的连接
pipfd监听时钟信号
user数组组管理多个该对象
sem
sem_t m_sem; 信号量返回对象
sem()sem(int) 初始化信号量(num个)bool wait() 减少信号量bool post()增加信号量
收藏
0 条评论
下一页
为你推荐
查看更多
抱歉,暂无相关内容