-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathhttp_connection.hpp
174 lines (123 loc) · 3.48 KB
/
http_connection.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#ifndef HTTP_CONNECTION_HPP
#define HTTP_CONNECTION_HPP
#include <sys/epoll.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <sys/mman.h>
#include <errno.h>
#include <sys/uio.h>
#include <stdlib.h>
#include <cstring>
#include <unordered_map>
#include <set>
#include <vector>
#include <cstring>
#include "locker.hpp"
#include "mysql_connection.hpp"
#include "bloom_filter.hpp"
#include "redis_connection.hpp"
//连接类--处理连接与任务
class HttpConnection
{
public:
//连接池
static HttpConnection* conns_pool;
// 所有的socket上的事件都被注册到同一个epoll_fd中
static int m_epoll_fd;
//统计用户数量 类的静态变量
static int m_user_num;
//布隆过滤器
static BloomFilter m_bloom_filter;
//文件名最大长度
static const int FILENAME_LEN = 200;
//读缓冲区大小
static const int READ_BUFFER_SIZE = 2048;
//写缓冲区大小
static const int WRITE_BUFFER_SIZE = 1024;
//名字映射socket
static std::unordered_map<std::string, int> m_name_socks;
//socket映射名字
static std::unordered_map<int, std::string> m_sock_names;
//群组映射
static std::unordered_map<int, std::set<int>> m_group;
//源地址与目的地址映射
static std::unordered_map<std::string, std::string> m_sour_dest;
static MysqlConnection mysql_g;
//用户名与socket映射的互斥锁
static Locker m_name_sock_mutex;
//socket与用户名映射的互斥锁
static Locker m_sock_name_mutex;
//原地址与目的地址映射互斥锁
static Locker m_sour_dest_mutex;
//群组映射互斥锁
static Locker m_group_mutex;
//设置静态EpollFd信息
void static setEpollFd(int epoll_fd);
//枚举请求类型
enum QUERY_CODE {COOKIE = 0, LOGIN, REGISTER, TARGET, CONTENT, GROUP, GROUP_MSG, NO_REQUEST};
//初始化连接池
static HttpConnection* initConnPool(int MAX_SIZE);
//构造函数
HttpConnection();
//析构函数
~HttpConnection();
//初始化
void init(int sock_fd, const sockaddr_in& addr);
//初始化读写状态
void initState();
//任务处理函数,由线程调用
void process();
//关闭连接
void closeConn();
//非阻塞一次性读
bool readData();
//非阻塞一次性写
bool writeData();
//填写缓冲区
bool setWriteBuffer(std::string content);
/*请求处理相关*/
//分析请求类型
QUERY_CODE parseRequest();
//生成回复
bool makeReply(QUERY_CODE code);
//检查会话过期
std::string checkSession();
//验证登陆信息
bool login();
//处理注册
bool registerUser();
//设置聊天对象
bool target();
//消息转发
bool transMsg();
//绑定群
bool group();
//消息群广播
bool transGroupMsg();
private:
//该连接的socket
int m_sock_fd;
//通信的socket地址
sockaddr_in m_addr;
//群组
std::set<int> m_sock_groups;
//当前所在群组
int cur_group;
//读相关
//读缓冲区
char m_read_buf[READ_BUFFER_SIZE];
//标识度读缓冲区当前已读位置
int m_read_index;
//写相关
//写缓冲区
char m_write_buf[WRITE_BUFFER_SIZE];
//将要发送的字节数
int bytes_to_send;
//已经发送的字节数
int bytes_have_send;
//写缓冲区待发送的位置
int m_write_index;
};
#endif