Skip to content

Commit

Permalink
mod server.h
Browse files Browse the repository at this point in the history
  • Loading branch information
gitover22 committed May 9, 2024
1 parent 8eb4cdc commit 65def02
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 39 deletions.
2 changes: 1 addition & 1 deletion src/server/epoller.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class Epoller{
/**
* @brief 修改当前epoll_fd实例上的事件
* @param fd [in] 待修改事件的文件描述符
* @param events [in] fd对应的事件
* @param events [in] 要监听fd上对应的事件
* @return 成功返回true,失败返回false
*/
bool Modify_Fd(int fd , uint32_t events);
Expand Down
36 changes: 14 additions & 22 deletions src/server/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,18 @@ Server::~Server(){
}


/**
* @brief 初始化服务器的事件模式
* @param trigMode 触发模式,0代表默认模式,1代表边缘触发,2代表水平触发,3代表对监听和连接都使用边缘触发
*/

void Server::Init_EventMode(int trigMode) {
// 水平触发(Level Triggered, LT)
// 行为:在这种模式下,只要被监控的文件描述符的状态仍然满足请求的条件,epoll_wait 就会重复通知该事件。例如,如果指定监听读事件,只要缓冲区中还有数据未读,epoll_wait 就会再次通知可读事件。
// 适用场景:在水平触发模式下,应用程序可以不用立即处理所有数据,也不需要非阻塞 I/O,因为 epoll_wait 会在数据依然可读或可写时再次通知。
// 优点:编程模型简单,易于理解和实现。
// 缺点:可能会导致更多的 epoll_wait 调用返回,因为只要条件满足,事件就会被反复报告,从而性能降低
// 边缘触发(Edge Triggered, ET)
// 行为:在边缘触发模式下,只有状态变化时(例如从不可读变为可读)epoll_wait 才会通知该事件一次。这意味着在 epoll_wait 通知之后,需要一次性处理掉所有的数据,直到对方发送更多的数据或状态再次改变。
// 适用场景:适用于非阻塞 I/O,这种模式可以减少 epoll_wait 的调用次数,提高应用程序效率,特别是在高负载时。
// 优点:减少了事件通知的次数,只在状态真正发生变化时才触发,可以显著提高程序的效率和性能。
// 缺点:编程复杂度高,需要确保每次事件通知时都完全处理完相关的数据,否则可能会错过事件处理。
// 默认的事件模式设置
listenEvent = EPOLLRDHUP;
connEvent = EPOLLONESHOT | EPOLLRDHUP; // EPOLLONESHOT表示只监听一次事件
Expand Down Expand Up @@ -117,13 +124,7 @@ void Server::Start() {
}
}
}
/**
* @brief 向 fd 发送错误信息并关闭连接
*
* @param fd [in] 文件描述符,用于标识客户端连接
* @param info [in] 错误信息的字符串指针
* @return 函数不返回任何值。
*/

void Server::Send_Error(int fd, const char*info) {
assert(fd > 0);

Expand All @@ -135,12 +136,6 @@ void Server::Send_Error(int fd, const char*info) {

close(fd); // 关闭文件描述符,即断开连接
}
/**
* @brief 关闭连接
*
* @param client [in] 指向HttpConn对象的指针,表示要关闭的连接
* @return 函数不返回任何值
*/

void Server::Close_Conn(HttpConn* client) {
assert(client);
Expand Down Expand Up @@ -234,17 +229,14 @@ void Server::On_Write(HttpConn* client) {
else if(ret < 0) {
if(writeErrno == EAGAIN) {
/* 继续传输 */
epoller->ModFd(client->GetFd(), connEvent | EPOLLOUT);
epoller->Modify_Fd(client->GetFd(), connEvent | EPOLLOUT);
return;
}
}
Close_Conn(client);
}

/**
* @brief 本函数用于创建并初始化服务器的Socket,设置相应的选项,并将其注册到epoll中等待监听。
* @return bool 返回true表示成功初始化,返回false表示初始化过程中遇到错误。
*/

bool Server::Init_Socket(){
int ret;
struct sockaddr_in addr;
Expand Down
42 changes: 26 additions & 16 deletions src/server/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,24 +57,27 @@ class Server{
*/
void Start();
private:
/*!
* @brief socket的初试化
*
/**
* @brief 本函数用于创建并初始化服务器的Socket,设置相应的选项,并将其注册到epoll中等待监听。
* @return bool 返回true表示成功初始化,返回false表示初始化过程中遇到错误。
*/
bool Init_Socket();

/*!
* @brief 初试化事件触发模式
* @param trigger_mode [in] 接受的触发模式
/**
* @brief 初始化服务器的事件模式
* @param trigger_mode [in] 触发模式,0代表默认模式,1代表边缘触发,2代表水平触发,3代表对监听和连接都使用边缘触发
*/
void Init_EventMode(int trigger_mode);
/**
* @brief 添加连接客户
* @param [in] fd 文件描述符
* @param [in] fd 客户端的文件描述符
* @param [in] addr 客户端地址信息
*/
void Add_Client(int fd, sockaddr_in addr);

/**
* @brief 监听listenFd上的客户链接请求
* @return void
*/
void Deal_Listen();

void Deal_Write(HttpConn* client);
Expand All @@ -83,31 +86,38 @@ class Server{


/**
* @brief 发送错误信息
* @param [in] fd 文件描述符
* @param [in] info 要发送的信息
* @brief 向 fd 发送错误信息并关闭连接
*
* @param fd [in] 文件描述符,用于标识客户端
* @param info [in] 错误信息的字符串指针
* @return 函数不返回任何值。
*/
void Send_Error(int fd, const char*info);

void Extent_Time(HttpConn* client);

/**
* @brief 关闭客户连接
* @param [in] client 客户端连接信息
*/
* @brief 关闭连接
*
* @param client [in] 指向HttpConn类的指针,表示要关闭的连接
* @return 函数不返回任何值
*/
void Close_Conn(HttpConn* client);

void On_Read(HttpConn* client);
void On_Write(HttpConn* client);
void On_Process(HttpConn* client);

/**
* @brief 设置文件描述符为非阻塞模式
* @param fd [in] 要设置的文件描述符
*/
static int Set_fd_Nonblock(int fd);

static const int MAX_FD = 65536;

int server_port;
bool openLinger;
int timeout; // 记录时间 单位:毫秒
int timeout; // 记录超时时间 单位:毫秒
bool isClose;
int listenFd;
static char* srcDir; //web 目录的路径
Expand Down

0 comments on commit 65def02

Please sign in to comment.