server.h 3.0 KB
Newer Older
羽飞's avatar
羽飞 已提交
1
/* Copyright (c) 2021 OceanBase and/or its affiliates. All rights reserved.
羽飞's avatar
羽飞 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14
miniob is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
         http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details. */

//
// Created by Longda on 2021/4/1.
//

羽飞's avatar
羽飞 已提交
15
#pragma once
羽飞's avatar
羽飞 已提交
16 17 18 19 20 21

#include "common/defs.h"
#include "common/metrics/metrics.h"
#include "common/seda/stage.h"
#include "net/server_param.h"

羽飞's avatar
羽飞 已提交
22 23
class Communicator;

24 25 26 27 28 29 30 31
/**
 * @brief 负责接收客户端消息并创建任务
 * @ingroup Communicator
 * @details 当前支持网络连接,有TCP和Unix Socket两种方式。通过命令行参数来指定使用哪种方式。
 * 启动后监听端口或unix socket,使用libevent来监听事件,当有新的连接到达时,创建一个Communicator对象进行处理。
 */
class Server 
{
羽飞's avatar
羽飞 已提交
32 33 34 35 36 37
public:
  Server(ServerParam input_server_param);
  ~Server();

public:
  static void init();
羽飞's avatar
羽飞 已提交
38
  static void close_connection(Communicator *comm);
羽飞's avatar
羽飞 已提交
39 40 41 42 43 44

public:
  int serve();
  void shutdown();

private:
45 46 47 48 49 50 51
  /**
   * @brief 接收到新的连接时,调用此函数创建Communicator对象
   * @details 此函数作为libevent中监听套接字对应的回调函数
   * @param fd libevent回调函数传入的参数,即监听套接字
   * @param ev 本次触发的事件,通常是EV_READ
   * @param arg 在注册libevent回调函数时,传入的参数,即Server对象
   */
羽飞's avatar
羽飞 已提交
52
  static void accept(int fd, short ev, void *arg);
53 54 55 56 57 58 59
  /**
   * @brief 接收到客户端消息时,调用此函数创建任务
   * @details 此函数作为libevent中客户端套接字对应的回调函数。当有新的消息到达时,调用此函数创建任务。
   * @param fd libevent回调函数传入的参数,即客户端套接字
   * @param ev 本次触发的事件,通常是EV_READ
   * @param arg 在注册libevent回调函数时,传入的参数,即Communicator对象
   */
羽飞's avatar
羽飞 已提交
60 61 62
  static void recv(int fd, short ev, void *arg);

private:
63 64 65 66 67
  /**
   * @brief 将socket描述符设置为非阻塞模式
   * 
   * @param fd 指定的描述符
   */
羽飞's avatar
羽飞 已提交
68
  int set_non_block(int fd);
69

羽飞's avatar
羽飞 已提交
70
  int start();
71 72 73 74

  /**
   * @brief 启动TCP服务
   */
羽飞's avatar
羽飞 已提交
75
  int start_tcp_server();
76 77 78 79

  /**
   * @brief 启动Unix Socket服务
   */
羽飞's avatar
羽飞 已提交
80 81
  int start_unix_socket_server();

82 83
  int start_stdin_server();

羽飞's avatar
羽飞 已提交
84
private:
85
  volatile bool started_ = false;
羽飞's avatar
羽飞 已提交
86

87 88 89
  int server_socket_ = -1;  ///< 监听套接字,是一个描述符
  struct event_base *event_base_ = nullptr; ///< libevent对象
  struct event *listen_ev_ = nullptr;  ///< libevent监听套接字事件
羽飞's avatar
羽飞 已提交
90

91
  ServerParam server_param_;  ///< 服务启动参数
羽飞's avatar
羽飞 已提交
92

93
  CommunicatorFactory communicator_factory_; ///< 通过这个对象创建新的Communicator对象
羽飞's avatar
羽飞 已提交
94

95
  static common::Stage *session_stage_;  ///< 通过这个对象创建新的请求任务
羽飞's avatar
羽飞 已提交
96
};