📄 ~cngpconn.~h
字号:
/**
* cngpconn.h
*
* Short Message Abstractive Library.(SMAL)
*
* Copyright 2003-2006 北京风起水流软件工作室
*
* http://www.zealware.com
*
* princetoad@gmail.com
*
*/
#ifndef _CNGP_CONNECTION_H
#define _CNGP_CONNECTION_H
#include <smal.h>
#include <common/util.h>
#include <list>
#include <cngp2/cngp_message.h>
#include <common/tcpsocket.h>
#include <cngp2/cngpbase.h>
#include <common/threadpool.h>
class CNGPClient;
/// CNGP连接类
/**
* CNGPConnection类,描述了一个到网通短信网关的连接,每个连接对应一个具体的TCP连接
* 此连接成功建立后,就可以通过CNGPConnection对象进行消息的收发.
*/
class CNGPConnection : public CCngp
{
public:
/**@name Construction */
//@{
/** 构造函数
*/
CNGPConnection(
CNGPClient & _client, ///< connection所属的client
const char * _token, ///< connection的标识
const char * _smghost, ///< 网关地址
const unsigned short & _smgport, ///< 网关端口
const unsigned char & _smgversion, ///< 版本
const char * _username, ///< 登录用户名
const char * _password, ///< 登录口令
const ConnectionType & _conntype, ///< 连接类型
const int & _nActivetestInterval, ///< 活动测试间隔
const char * _localhost = NULL, ///< 本地绑定地址
const unsigned short & _localport = 0, ///< 本地绑定端口
BOOL sync = TRUE ///< 是否在连接后发送登录包
);
/** 输出统计信息(收发的消息数,状态报告数等)
*/
virtual void DumpStatus();
/** 析构函数
*/
virtual ~CNGPConnection();
//@}
/**@name GetFunctions */
//@{
/** 返回所属的client
*/
CNGPClient & GetClient() const
{ return client; }
/** 返回连接标识
*/
const char * GetToken() const
{ return token; }
/** 返回网关地址
*/
const char * GetSmgHost() const
{ return smghost; }
/** 返回网关端口
*/
int GetSmgPort() const
{ return (int)smgport; }
/** 返回登录用户名
*/
const char * GetUserName() const
{ return username; }
/** 返回登录口令
*/
const char * GetPassword() const
{ return password; }
/** 返回连接类型
*/
ConnectionType GetConnectionType() const
{ return conntype; }
/** 返回发送的SUBMIT消息数
*/
long GetSubmitCount() const
{ return submitCount; }
/** 返回发送成功的SUBMIT消息数
*/
long GetSubmitSucceedCount() const
{ return submitSucceedCount; }
/** 返回发送失败的SUBMIT消息数
*/
long GetSubmitFailedCount() const
{ return submitFailedCount; }
/** 返回失败的SUBMITResponse消息数
*/
long GetRespFailedCount() const
{ return respFailedCount; }
/** 返回成功的SUBMITResponse消息数
*/
long GetRespSucceedCount() const
{ return respSucceedCount; }
/** 返回收到的Deliver消息数
*/
long GetDeliverCount() const
{ return deliverCount; }
/** 返回收到的StatusReport消息数
*/
long GetStatusReportCount() const
{ return sreportCount; }
/** 返回当前连接是否忙碌(忙碌表示正在收发消息)
*/
BOOL IsBusy() const
{ return m_fBusy; }
/** 连接是否已经启动
*/
BOOL IsOpened()
{ return m_fLogined && m_fStarted; }
/** 连接是否可用
*/
BOOL IsReady()
{ return IsOpened() && !IsBusy(); }
/** 是否可以发送消息
*/
BOOL CanMakeSubmit()
{ return (conntype != e_RecvOnly) && IsReady(); }
//@}
/**@name CNGP Command Function */
//@{
/** 清除连接 */
void Clear();
/** 提交SUBMIT消息
*/
inline int Submit(
cngp_submit & _message ///< 要发送的cngp_submit消息
);
/** 主动发活动测试包
*/
inline int ActiveTest();
//@}
/**@name 消息响应函数 */
//@{
/** 登录网关成功时调用
*/
virtual void OnLogined();
/** 登录网关失败时调用
*/
virtual void OnLoginFailed(
int errorCode ///< 错误返回值
);
/** 同网关连接断开时调用
*/
virtual void OnCleared();
/** 发送SUBMIT消息前调用,如果返回失败,则停止发送SUBMIT消息.
在这里,只是简单地返回TRUE.
*/
virtual BOOL OnSubmiting(
cngp_submit _message ///< 即将提交发送的cngp_submit消息
);
/** 发送SUBMIT消息成功时调用
*/
virtual void OnSubmited(
cngp_submit _message ///< 已经成功发送的cngp_submit消息
);
/** 发送SUBMIT消息失败时调用 */
virtual void OnSubmitFailed(
cngp_submit _message ///< 发送失败的cngp_submit消息
);
/** 收到CONNECT_RESPONSE时调用
*/
virtual void OnReceivedConnectResponse(
cngp_login_resp _message
);
/** 收到Terminate消息时调用
*/
virtual void OnReceivedTerminate();
/** 收到SUBMIT_RESPONSE时调用
*/
virtual void OnReceivedSubmitResponse(
cngp_submit_deliver_resp _message
);
/** 收到Deliver消息时调用
*/
virtual void OnReceivedDeliver(
cngp_deliver _message
);
/** 收到STATUS_REPORT时调用
*/
virtual void OnReceivedStatusReport(
cngp_deliver _message
);
/** 收到活动测试消息时调用
*/
virtual void OnReceivedActiveTest();
/** 收到活动测试回复消息时调用
*/
virtual void OnReceivedActiveTestResponse();
/**输出日志时调用
格式化输出日志,默认是把内容//TRACE出来
*/
virtual void OnLogWrite(const char * pchFmt, ...);
//@}
BOOL isOK;
protected:
/** 初始化变量
*/
void Initialize();
/** 设置当前连接忙闲状态
*/
void SetBusy( BOOL status )
{ m_fBusy = status; }
/** 建立网关连接,启动消息接收模块
*/
int CreateConnection();
/** 连接网关,登录网关
*/
int Connect(
BOOL outputdebug = TRUE ///< 是否输出调试信息
);
/** 断开连接
*/
void Terminate();
/** 接收SMG方面的所有消息
*/
inline int RecvSmgMsg(
cngp_smgtosp * css,
unsigned int & nResult
);
/** 用于接收消息线程
*/
static DWORD WINAPI RecvFunc(LPVOID pParam);
/** 接收消息函数
*/
virtual DWORD RecvProc();
void AdjustActiveTestTimer( int & timeout );
protected:
CNGPClient & client; ///< 所属client
char token[MAX_PATH]; ///< 连接ID(YYMMDDhhmmsslll)
char localhost[MAX_PATH]; ///< 本地绑定地址
unsigned short localport; ///< 本地绑定端口
char smghost[MAX_PATH]; ///< 网关地址
unsigned short smgport; ///< 网关端口
unsigned char smgversion; ///< 网关支持的最高版本号
char username[MAX_PATH]; ///< 网关登录用户名
char password[MAX_PATH]; ///< 网关登录口令
ConnectionType conntype; ///< 网关连接类型
TCPSocket m_socket; ///< TCPSOCKET类
BOOL m_fStop; ///< 停止标志.
BOOL m_fLogined; ///< 是否成功登录
BOOL m_fStarted; ///< 是否成功启动
BOOL m_fBusy; ///< 是否正在发送消息
int m_RetryInterval; ///< 重试时间间隔(ms)
BOOL m_fAutoResp; ///< 是否自动回复
MyCriticalSection m_socketCS; ///< socket句柄锁
HANDLE m_hRecvThread; ///< 接收线程句柄.
char connectTime[MAX_PATH]; ///< 成功连接网关的时间
char loginTime[MAX_PATH]; ///< 成功登录时间
char disconnectTime[MAX_PATH]; ///< 断开时间
long submitCount; ///< 提交的SUBMIT消息数
long submitSucceedCount; ///< SUBMIT发送成功消息数
long submitFailedCount; ///< SUBMIT发送失败消息数
long respSucceedCount; ///< 收到的submitresponse消息数
long respFailedCount; ///< 收到的submitresponse消息数
long deliverCount; ///< 收到的Deliver消息数
long sreportCount; ///< 状态报告数
};
/**
* CNGPConnection连接队列
*/
typedef std::list<CNGPConnection*> aList;
//
// 用于处理消息和事件的线程池
//
class CJobCngp : public IJobDesc {
public:
CJobCngp(
CNGPClient & _client,
CNGPConnection & _connection,
JobType _type
);
CJobCngp(
CNGPClient & _client,
CNGPConnection & _connection,
JobType _type,
cngp_submit_deliver_resp _message
);
CJobCngp(
CNGPClient & _client,
CNGPConnection & _connection,
JobType _type,
cngp_deliver _message
);
CJobCngp(
CNGPClient & _client,
CNGPConnection & _connection,
JobType _type,
cngp_submit _message,
int nResult = 0
);
~CJobCngp();
void OnSendSubmit();
void OnSubmitSucceed();
void OnDeliver();
void OnStatusReport();
void OnActiveTestResponse();
void OnActiveTest();
void OnCancelResponse();
void OnTerminate();
void OnConnectResponse();
void OnSubmitFailed();
void OnSubmitResponse();
void OnSubmiting();
JobType type;
protected:
CNGPClient & client;
CNGPConnection & connection;
cngp_submit submitMsg;
cngp_deliver deliverMsg;
cngp_login_resp connectRespMsg;
cngp_submit_deliver_resp submitRespMsg;
int nResult;
};
class CWorkerCngp : public IWorker {
virtual void ProcessJob( IJobDesc* pJobDesc );
};
/// CNGPClient终端类实现
/**
* CNGPClient类,表示一个CNGP短信终端,一个终端可以包括数个CNGPConnection对象,
* 并且可以对这些连接进行管理.
*/
class CNGPClient
{
public:
/**@name Construction */
//@{
CNGPClient();
virtual ~CNGPClient();
//@}
/**@name GetFunctions */
//@{
/**得到提交的SUBMIT消息数
*/
long GetSubmitCount() const
{ return submitCountTotal; }
/**得到发送成功的SUBMIT消息数
*/
long GetSubmitSucceedCount() const
{ return submitSucceedCountTotal; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -