TCP 服务器,基于 Epoll 实现。
ServerInterface 的子类。
文件配置可参见 conf.template 相关条目。
namespace fpnn;
class TCPEpollServer: virtual public ServerInterface
{
public:
virtual ~TCPEpollServer();
static TCPServerPtr create();
static TCPEpollServer* nakedInstance();
static TCPServerPtr instance();
virtual bool startup();
virtual void run();
virtual void stop();
virtual void setIP(const std::string& ip);
virtual void setIPv6(const std::string& ipv6);
virtual void setPort(uint16_t port);
virtual void setPort6(unsigned short port);
virtual void setBacklog(int backlog);
virtual uint16_t port() const;
virtual uint16_t port6() const;
virtual std::string ip() const;
virtual std::string ipv6() const;
virtual uint16_t sslPort() const;
virtual uint16_t sslPort6() const;
virtual std::string sslIP() const;
virtual std::string sslIP6() const;
virtual int32_t backlog() const;
inline void setMaxEvents(int maxCount);
inline void setIoBufferChunkSize(size_t size);
int maxEvent() const;
size_t ioBufferChunkSize() const;
virtual void setQuestProcessor(IQuestProcessorPtr questProcessor);
virtual IQuestProcessorPtr getQuestProcessor();
inline void setEstimateMaxConnections(size_t estimateMaxConnections, int partitionCount = 128);
inline void setMaxConnectionLimitation(int maxConnectionLimitation);
inline int maxConnectionLimitation();
inline int currentConnections();
inline void configWorkerThreadPool(int32_t initCount, int32_t perAppendCount, int32_t perfectCount, int32_t maxCount, size_t maxQueueSize);
inline void enableAnswerCallbackThreadPool(int32_t initCount, int32_t perAppendCount, int32_t perfectCount, int32_t maxCount);
void closeConnection(const ConnectionInfo* ci);
inline void closeConnection(const ConnectionInfo& ci);
/*
Experimental interface.
** Maybe change or remove in following version. **
*/
void closeConnectionAfterSent(const ConnectionInfo* ci);
inline void closeConnectionAfterSent(const ConnectionInfo& ci);
inline void setQuestTimeout(int64_t seconds);
inline int64_t getQuestTimeout();
inline void setIdleTimeout(int64_t seconds);
inline int64_t getIdleTimeout();
virtual std::string workerPoolStatus();
virtual std::string answerCallbackPoolStatus();
inline bool encrpytionEnabled();
inline bool enableEncryptor(const std::string& curve, const std::string& privateKey);
static void enableForceEncryption();
inline bool ipWhiteListEnabled();
inline void enableIPWhiteList(bool enable = true);
inline bool addIPToWhiteList(const std::string& ip);
inline bool addSubnetToWhiteList(const std::string& ip, int subnetMaskBits);
inline void removeIPFromWhiteList(const std::string& ip);
};
typedef std::shared_ptr<TCPEpollServer> TCPServerPtr;
注意
代码中,class TCPEpollServer
的非文档化基类,和非文档化的接口可能随时会更改。因此,请仅使用本文档中,明确列出的接口。
static TCPServerPtr create();
创建 TCPEpollServer 实例。
目前 FPNN Framework 是单例。如果 TCPEpollServer 已经创建,将返回已创建的实例。
static TCPEpollServer* nakedInstance();
获取 TCPEpollServer 单例的裸指针。如果单例没有被创建,则返回 NULL
。
static TCPServerPtr instance();
获取 TCPEpollServer 单例的智能指针。如果单例没有被创建,则返回 nullptr
。
virtual bool startup();
启动服务器。
virtual void run();
服务器主循环。
virtual void stop();
停止服务器。
virtual void setIP(const std::string& ip);
设置需要绑定的 IP v4 地址。
virtual void setIPv6(const std::string& ipv6);
设置需要绑定的 IP v6 地址。
virtual void setPort(uint16_t port);
设置需要绑定的 IP v4 端口。
virtual void setPort6(unsigned short port);
设置需要绑定的 IP v6 端口。
virtual void setBacklog(int backlog);
设置 accept 等候队列长度。
virtual uint16_t port() const;
获取绑定的 IP v4 端口。
virtual uint16_t port6() const;
获取绑定的 IP v6 端口。
virtual std::string ip() const;
获取绑定的 IP v4 地址。
virtual std::string ipv6() const;
获取绑定的 IP v6 地址。
virtual uint16_t sslPort() const;
获取绑定的 SSL/TLS IP v4 端口。
virtual uint16_t sslPort6() const;
获取绑定的 SSL/TLS IP v6 端口。
virtual std::string sslIP() const;
获取绑定的 SSL/TLS IP v4 地址。
virtual std::string sslIP6() const;
获取绑定的 SSL/TLS IP v6 地址。
virtual int32_t backlog() const;
获取 accept 等候队列长度。
inline void setIoBufferChunkSize(size_t size);
设置在执行非加密数据接收、SSL/TLS (FPNN) 加密数据接收、HTTP/HTTPS 数据接收时,接收用的链式缓存 (ChainBuffer)[../base/ChainBuffer.md] 单位缓存块的大小。
size_t ioBufferChunkSize() const;
获取在执行非加密数据接收、SSL/TLS (FPNN) 加密数据接收、HTTP/HTTPS 数据接收时,接收用的链式缓存 (ChainBuffer)[../base/ChainBuffer.md] 单位缓存块的大小。
virtual void setQuestProcessor(IQuestProcessorPtr questProcessor);
配置服务器事件和请求处理模块。具体可参见 IQuestProcessor。
virtual IQuestProcessorPtr getQuestProcessor();
获取服务器事件和请求处理模块。具体可参见 IQuestProcessor。
inline void setEstimateMaxConnections(size_t estimateMaxConnections, int partitionCount = 128);
设置 TCPEpollServer 支持的连接数峰值。
注意
- 该接口为调优使用,一般情况采用默认配置即可,无需调用。
- 该接口必须在 TCPEpollServer 启动前调用。否则将会被忽略。
参数说明
-
size_t estimateMaxConnections
预估的 TCPEpollServer 峰值的连接数。
-
int partitionCount
连接管理模块的数量。
inline void setMaxConnectionLimitation(int maxConnectionLimitation);
设置 TCPEpollServer 支持的最大连接数限制。
inline int maxConnectionLimitation();
获取 TCPEpollServer 支持的最大连接数限制。
inline int currentConnections();
获取当前服务器的链接数量。
inline void configWorkerThreadPool(int32_t initCount, int32_t perAppendCount, int32_t perfectCount, int32_t maxCount, size_t maxQueueSize);
配置 TCPEpollServer 的工作线程池。
注意
- 一般情况采用默认配置即可。
- 该接口必须在 TCPEpollServer 启动前调用。否则将会被忽略。
- 如果在显示调用该接口,则配置文件中的相关配置将被忽略。
参数说明
-
int32_t initCount
初始的线程数量。
-
int32_t perAppendCount
追加线程时,单次的追加线程数量。
注意,当线程数超过
perfectCount
的限制后,单次追加数量仅为1
。 -
int32_t perfectCount
线程池常驻线程的最大数量。
-
int32_t maxCount
线程池线程最大数量。如果为
0
,则表示不限制。
inline void enableAnswerCallbackThreadPool(int32_t initCount, int32_t perAppendCount, int32_t perfectCount, int32_t maxCount);
配置 TCPEpollServer 处理 Server Push 应答的线程池。
注意
- 一般情况采用默认配置即可。
- 该接口必须在 TCPEpollServer 启动前调用。否则将会被忽略。
- 如果在显示调用该接口,则配置文件中的相关配置将被忽略。
参数说明
-
int32_t initCount
初始的线程数量。
-
int32_t perAppendCount
追加线程时,单次的追加线程数量。
注意,当线程数超过
perfectCount
的限制后,单次追加数量仅为1
。 -
int32_t perfectCount
线程池常驻线程的最大数量。
-
int32_t maxCount
线程池线程最大数量。如果为
0
,则表示不限制。
void closeConnection(const ConnectionInfo* ci);
inline void closeConnection(const ConnectionInfo& ci);
关闭指定链接。ConnectionInfo 请参见连接信息对象 ConnectionInfo。
void closeConnectionAfterSent(const ConnectionInfo* ci);
inline void closeConnectionAfterSent(const ConnectionInfo& ci);
发送完当前数据后,关闭指定链接。ConnectionInfo 请参见连接信息对象 ConnectionInfo。
inline void setQuestTimeout(int64_t seconds);
设置 TCP Server Push 请求超时的全局默认值。
inline int64_t getQuestTimeout();
获取 TCP Server Push 请求超时的全局默认值。
inline void setIdleTimeout(int64_t seconds);
设置空闲时间。
如果链接在指定的空闲时间内,没有完整的数据包收发,则 TCPEpollServer 将关闭链接。0
表示不限制。
inline int64_t getIdleTimeout();
获取空闲时间设置。
virtual std::string workerPoolStatus();
返回 TCPEpollServer 的工作线程池的状态。Json 格式。
virtual std::string answerCallbackPoolStatus();
返回 TCPEpollServer 处理 Server Push 应答的线程池状态。Json 格式。
inline bool encrpytionEnabled();
判断 TCP 服务器是否启动了加密。
inline bool enableEncryptor(const std::string& curve, const std::string& privateKey);
启用链接加密。
参数说明
-
const std::string& curve
ECDH (椭圆曲线密钥交换) 所用曲线名称。
可用值:
- "secp256k1"
- "secp256r1"
- "secp224r1"
- "secp192r1"
-
const std::string& privateKey
服务器私钥(二进制数据)。
注意
该私钥为裸密钥,由 FPNN 框架内置工具 eccKeyMaker 生成。
static void enableForceEncryption();
强制所有接口必须加密访问。
inline bool ipWhiteListEnabled();
判断白名单是否启用。
inline void enableIPWhiteList(bool enable = true);
启用或者禁用白名单。
inline bool addIPToWhiteList(const std::string& ip);
添加 IP 地址 (IP v4 或者 IP v6)到白名单中。
inline bool addSubnetToWhiteList(const std::string& ip, int subnetMaskBits);
添加 IP v4 网段到白名单中。
参数说明
-
const std::string& ip
网段 IP。
-
int subnetMaskBits
子网掩码位数。
inline void removeIPFromWhiteList(const std::string& ip);
将指定 IP 地址从白名单中删除。