Skip to content

Latest commit

 

History

History
149 lines (124 loc) · 3.29 KB

File metadata and controls

149 lines (124 loc) · 3.29 KB

CommConnEntry

每一个连接的结构

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

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;
};

CommConnection

todo : 这里什么作用?

class CommConnection
{
protected:
	virtual ~CommConnection() { }
	friend class Communicator;
};

CommService

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;
};