acl/lib_acl_cpp/include/acl_cpp/ipc/ipc_service.hpp
zsxxsz 9527c34565 提高了 ipc 通信安全性,修复了新的线程池服务器模版的初始化问题
ipc 通信时进行了安全校验,防止外来连接攻击;新的线程池服务器模版调整了初始化调用顺序,便于在设定定时器时可以取得事件引擎句柄
2014-01-06 21:08:57 +08:00

128 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include "acl_cpp/acl_cpp_define.hpp"
#include "acl_cpp/stdlib/locker.hpp"
#include "acl_cpp/ipc/ipc_server.hpp"
struct acl_pthread_pool_t;
namespace acl {
class ipc_client;
class ACL_CPP_API ipc_request
{
public:
ipc_request();
virtual ~ipc_request();
/**
* 虚接口,子类实现此类用于处理具体的任务,该接口适用
* 于采用 IO 消息的模式
*/
virtual void run(ipc_client* ipc);
#ifdef WIN32
/**
* 虚接口,子类实现此类用于处理具体的任务,该接口适用
* 于采用 WIN32 消息的模式
*/
virtual void run(HWND hWnd);
/**
* 设置 WIN32 窗口句柄
* @param hWnd {HWND} 窗口句柄
*/
void set_hwnd(HWND hWnd)
{
hWnd_ = hWnd;
}
/**
* 获得 WIN32 窗口句柄
* @return {HWND} 窗口句柄
*/
HWND get_hwnd(void) const
{
return (hWnd_);
}
#endif
private:
#ifdef WIN32
HWND hWnd_;
#endif
};
class ACL_CPP_API ipc_service : public ipc_server
{
public:
/**
* 构造函数
* @param nthread {int} 如果该值 > 1 则内部自动采用线程池,否则
* 则是一个请求一个线程
* @param ipc_keep {bool} 内部 IPC 消息流是否保持长连接,保持长
* 连接有助于提高消息传递的效率
*/
ipc_service(int nthread, bool ipc_keep = true);
virtual ~ipc_service();
#ifdef WIN32
/**
* 当采用 WIN32 消息模式时,子类需要实现此虚接口用于处理具体的
* 消息过程,子类必须实现该接口
* @param hWnd {HWND} 窗口句柄
* @param msg {UINT} 用户自定义消息号
* @param wParam {WPARAM} 参数
* @param lParam {LPARAM} 参数
*/
virtual void win32_proc(HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam);
#endif
/**
* 从 ipc 消息流连接池中取得一个连接
* @return {ipc_client*} 返回 NULL 表示无法连接消息服务器
*/
ipc_client* peek_conn();
/**
* 将用完的 ipc 消息连接放回连接池中
* @param conn {ipc_client*} ipc 消息连接流
*/
void push_conn(ipc_client* conn);
protected:
#ifdef WIN32
__int64 magic_;
#else
long long int magic_;
#endif
/**
* 子类调用此函数发送请求服务
* @param req {ipc_request*}
*/
void request(ipc_request* req);
private:
bool ipc_keep_;
acl_pthread_pool_t* thread_pool_;
#ifdef WIN32
HWND hWnd_;
HINSTANCE hInstance_;
/**
* 基类虚函数Windows 消息方式下,创建隐藏窗口句柄
*/
virtual bool create_window(void);
/**
* 基类虚函数Windows 消息方式下,关闭隐藏窗口句柄
*/
virtual void close_window(void);
#endif
locker lock_;
std::list<ipc_client*> conn_pool_;
};
} // namespace acl