每一个连接的结构
struct CommConnEntry
{
struct list_head list;
CommConnection *conn;
long long seq;
int sockfd;
#define CONN_STATE_CONNECTING 0
#define CONN_STATE_CONNECTED 1
#define CONN_STATE_RECEIVING 2
#define CONN_STATE_SUCCESS 3
#define CONN_STATE_IDLE 4
#define CONN_STATE_KEEPALIVE 5
#define CONN_STATE_CLOSING 6
#define CONN_STATE_ERROR 7
int state;
int error;
int ref;
struct iovec *write_iov;
SSL *ssl;
CommSession *session;
CommTarget *target;
CommService *service;
mpoller_t *mpoller;
/* Connection entry's mutex is for client session only. */
pthread_mutex_t mutex;
};其中的一个成员是CommSession
CommSession是一次req->resp的交互,主要要实现message_in(), message_out()等几个虚函数,让核心知道怎么产生消息。 对server来讲,session是被动产生的
class CommSession
{
private:
virtual CommMessageOut *message_out() = 0; // 往连接上要发的数据
virtual CommMessageIn *message_in() = 0;
virtual int send_timeout() { return -1; }
virtual int receive_timeout() { return -1; }
virtual int keep_alive_timeout() { return 0; }
virtual int first_timeout() { return 0; } /* for client session only. */
virtual void handle(int state, int error) = 0; // 连接上收到数据流,如何切下一个数据包
private:
virtual int connect_timeout() { return this->target->connect_timeout; }
virtual int response_timeout() { return this->target->response_timeout; }
protected:
CommTarget *get_target() const { return this->target; }
CommConnection *get_connection() const { return this->conn; }
CommMessageOut *get_message_out() const { return this->out; }
CommMessageIn *get_message_in() const { return this->in; }
long long get_seq() const { return this->seq; }
private:
CommTarget *target;
CommConnection *conn;
CommMessageOut *out;
CommMessageIn *in;
long long seq;
private:
struct timespec begin_time;
int timeout;
int passive;
public:
CommSession() { this->passive = 0; }
virtual ~CommSession();
friend class Communicator;
};todo : 这里什么作用?
class CommConnection
{
protected:
virtual ~CommConnection() { }
friend class Communicator;
};class CommService
{
public:
int init(const struct sockaddr *bind_addr, socklen_t addrlen,
int listen_timeout, int response_timeout);
void deinit();
int drain(int max);
public:
void get_addr(const struct sockaddr **addr, socklen_t *addrlen) const;
protected:
void set_ssl(SSL_CTX *ssl_ctx, int ssl_accept_timeout);
SSL_CTX *get_ssl_ctx() const { return this->ssl_ctx; }
private:
virtual CommSession *new_session(long long seq, CommConnection *conn) = 0;
virtual void handle_stop(int error) { }
virtual void handle_unbound() = 0;
private:
virtual int create_listen_fd();
virtual CommConnection *new_connection(int accept_fd);
virtual int init_ssl(SSL *ssl) { return 0; }
private:
struct sockaddr *bind_addr;
socklen_t addrlen;
int listen_timeout;
int response_timeout;
int ssl_accept_timeout;
SSL_CTX *ssl_ctx;
public:
void incref();
void decref();
private:
int listen_fd;
int ref;
private:
struct list_head alive_list;
pthread_mutex_t mutex;
public:
virtual ~CommService() { }
friend class CommServiceTarget;
friend class Communicator;
};