EuvStmServerBase.hpp
1 //
2 // Created by xiong on 2021/12/9.
3 //
4 
5 #ifndef EMX_EuvStmServerBase_HPP
6 #define EMX_EuvStmServerBase_HPP
7 
8 #include <list>
9 #include "EuvStreamInf.hpp"
10 
11 namespace Emx {
15  class EuvStmServerClientBase;
16 
24  public:
25 
26  EuvStmServerHostBase(EuvStreamInf *stm) : m_stm(stm), m_buffer(nullptr) {}
27 
28  virtual ~EuvStmServerHostBase() { Destroy(); }
29 
41  ErrCodeE Create(EuvLoop &loop, const char *ip, uint16_t port, int maxClientNum, char *buffer, int32_t size);
42 
46  void Destroy();
47 
53 
54  protected:
55 
64 
69  virtual void OnClientConnect(EuvStmServerClientBase *client) = 0;
70 
75  virtual void OnClientDisConnect(EuvStmServerClientBase *client) = 0;
76 
83  virtual void OnRecv(EuvStmServerClientBase *client, char *data, int32_t size) = 0;
84 
85  private:
86  EuvLoop *m_loop;
87  EuvStreamInf *m_stm;
88  char *m_buffer;
89  int32_t m_size;
90  std::list<EuvStmServerClientBase *> m_clientList;
91  };
92 
101  public:
103  m_stm(stm), m_host(host) {
104  m_sendByPack = false;
105  m_maxSend = -1;
106  m_curSendSize = 0;
107  m_curSendPack = 0;
108  };
109 
111 
117  ErrCodeE Send(std::shared_ptr<std::string> &data);
118 
124  void SetMaxSendBuffer(bool sendByPack, int32_t maxSend) {
125  m_sendByPack = sendByPack;
126  m_maxSend = maxSend;
127  };
128 
133  EuvStmServerHostBase *GetHost() { return m_host; }
134 
139  EuvStreamInf *GetStmInf() { return m_stm; }
140 
145  int32_t GetCurBufferedPack() { return m_curSendPack; }
146 
151  int32_t GetCurBufferedSize() { return m_curSendSize; }
152 
159  virtual void OnSendDone(ErrCodeE e, const char *buffer, int32_t size) {};
160 
161  private:
162  void SendInc(int32_t size) {
163  m_curSendPack++;
164  m_curSendSize += size;
165  }
166 
167  void SendDec(int32_t size) {
168  m_curSendPack--;
169  m_curSendSize -= size;
170  }
171 
172  bool BufferOverflow() const {
173  if (m_maxSend != -1) {
174  return m_sendByPack ? m_curSendPack > m_maxSend : m_curSendSize > m_maxSend;
175  }
176  return false;
177  }
178 
179  struct WriteReq {
180  uv_write_t req;
181  uv_buf_t buf;
182  std::shared_ptr<std::string> data;
184  };
185 
186  private:
187  bool m_sendByPack;//buffer size calculate by pack number or total stream size
188  int32_t m_maxSend;//limited send buffer size
189  int32_t m_curSendSize;//current stream size
190  int32_t m_curSendPack;//current pack num
191  EuvStreamInf *m_stm;
192  EuvStmServerHostBase *m_host;
193  };
195 }
196 
197 #endif //EMX_EuvStmServerBase_HPP
实现多路复用循环的主体,所有基于EuvLoop的事件都应绑定到一个EuvLoop上
Definition: EuvLoop.hpp:18
面向连接的socket通信ServerClient端基类,是服务端accept后的socket, 实现了这种类型ServerClient端的创建销毁发送接收, 内部使用EuvStreamInf抽象接口作...
Definition: EuvStmServerBase.hpp:100
int32_t GetCurBufferedSize()
获取当前需要发送的字节数
Definition: EuvStmServerBase.hpp:151
EuvStmServerClientBase(EuvStreamInf *stm, EuvStmServerHostBase *host)
Definition: EuvStmServerBase.hpp:102
virtual ~EuvStmServerClientBase()
Definition: EuvStmServerBase.hpp:110
virtual void OnSendDone(ErrCodeE e, const char *buffer, int32_t size)
当调用Send发送的数据发送完毕,或是出现错误时触发此回调
Definition: EuvStmServerBase.hpp:159
EuvStreamInf * GetStmInf()
获取EuvStreamInf
Definition: EuvStmServerBase.hpp:139
int32_t GetCurBufferedPack()
获取当前需要发送的包数
Definition: EuvStmServerBase.hpp:145
ErrCodeE Send(std::shared_ptr< std::string > &data)
向客户端发送数据
EuvStmServerHostBase * GetHost()
获取ServerHost的指针
Definition: EuvStmServerBase.hpp:133
void SetMaxSendBuffer(bool sendByPack, int32_t maxSend)
调用Send发送的数据是需要等待发送缓冲区可用的,此函数负责设置当缓冲区满的情况下最多缓存的数据量
Definition: EuvStmServerBase.hpp:124
面向连接的socket通信ServerHost端基类,是服务端的监听socket,实现了这种类型ServerHost端的创建销毁发送接收, 内部使用EuvStreamInf抽象接口作为底层通信接口,实际...
Definition: EuvStmServerBase.hpp:23
virtual void OnClientConnect(EuvStmServerClientBase *client)=0
当客户端成功连接时触发此回调
EuvStmServerHostBase(EuvStreamInf *stm)
Definition: EuvStmServerBase.hpp:26
void DisConnectClient(EuvStmServerClientBase *client)
主动断开一个客户端的链接,断开后会触发OnClientDisConnect回调
virtual EuvStmServerClientBase * OnAllocClient()=0
当有客户端到来时,需要分配一个继承自EuvStmServerClientBase的ServerClient客户端给ServerHost
virtual ~EuvStmServerHostBase()
Definition: EuvStmServerBase.hpp:28
ErrCodeE Create(EuvLoop &loop, const char *ip, uint16_t port, int maxClientNum, char *buffer, int32_t size)
创建服务端并监听连接
virtual void OnRecv(EuvStmServerClientBase *client, char *data, int32_t size)=0
当某个ServerClient接收到数据时触发此回调
virtual void OnClientDisConnect(EuvStmServerClientBase *client)=0
当客户端断开链接时触发此回调
void Destroy()
停止监听并销毁
面向链接类型的抽象接口(例如tcp/pipe),用于为EuvStmClientBase/EuvStmServerHostBase等提供统一的底层通信接口
Definition: EuvStreamInf.hpp:17
ErrCodeE
错误码定义
Definition: EmxTypeDef.hpp:29
Definition: EmxGpio.hpp:10