📄 ~smppconn.~h
字号:
/**
* smppconn.h
*
* Short Message Abstractive Library.(SMAL)
*
* Copyright 2003-2006 北京风起水流软件工作室
*
* http://www.zealware.com
*
* princetoad@gmail.com
*
*/
#ifndef _SMPP34_CONNECTION_H
#define _SMPP34_CONNECTION_H
#include <smal.h>
#include <common/util.h>
#include <list>
#include <smpp3/smpp_message.h>
#include <common/tcpsocket.h>
#include <smpp3/smppbase.h>
#include <common/threadpool.h>
class SMPPClient;
///////////////////////////////////////////////////////////////////////////////
//
class SMPPConnection : public CSmpp
{
public:
/**@name Construction */
//@{
/**构造函数
*/
SMPPConnection(
SMPPClient & _client, ///< connection所属的client
const char * _token, ///< connection的标识
const char * _serverHost, ///< 网关地址
const unsigned short & _serverPort, ///< 网关端口
const ConnectionType & _connectionType, ///< 连接类型
const char * _systemID, ///< 登录用户名
const char * _password, ///< 登录口令
const char * _systemType, ///< 接口类型
const unsigned char & _interfaceVersion, ///< 网关版本号
const int & _nActivetestInterval, ///< 活动测试间隔
BOOL sync = TRUE ///< 是否同步,直到连接建立
);
/**打印统计信息
*/
virtual void DumpStatus();
/**析构函数
*/
virtual ~SMPPConnection();
//@}
/**@name GetFunctions */
//@{
/**得到连接所属的client
*/
SMPPClient & GetClient() const
{ return client; }
/**得到连接标识
*/
const char * GetToken() const
{ return token; }
/**得到短信中心地址
*/
const char * GetSmscHost() const
{ return server_host; }
/**得到短信中心端口
*/
int GetSmscPort() const
{ return (int)server_port; }
/**得到登录用户名
*/
const char * GetSystemID() const
{ return system_id; }
/**得到登录口令
*/
const char * GetPassword() const
{ return password; }
/**得到接口类型
*/
const char * GetSystemType() const
{ return system_type; }
/**得到连接类型
*/
ConnectionType GetConnectionType() const
{ return conntype; }
/** 得到系统版本号
*/
int GetInterfacVersion() const
{ return (int)interface_version; }
/**得到发送的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; }
/**当前连接是否忙碌
*/
BOOL IsBusy() const
{ return m_fBusy; }
/**设置当前连接忙闲状态
*/
void SetBusy(BOOL status)
{ m_fBusy = status; }
/**连接是否已经启动
*/
BOOL IsOpened()
{ return m_fLogined && m_fStarted; }
/**连接是否可用
*/
BOOL IsReady()
{ return IsOpened() && !IsBusy(); }
/**是否可以发送消息
*/
BOOL CanMakeSubmit()
{ return (conntype > e_RecvOnly) && IsReady(); }
//@}
/**@name SMPP Command Function */
//@{
/**发送SUBMIT消息
*/
inline int Submit(
PDU_SMPP_SUBMIT_SM & _message
);
//@}
/**@name Callback functions */
//@{
/**登录网关成功时调用
*/
virtual void OnLogined();
/**登录网关失败时调用
*/
virtual void OnLoginFailed(int errorCode);
/**同网关连接断开时调用
*/
virtual void OnCleared();
/**发送SUBMIT消息前调用,如果返回失败,则停止发送SUBMIT消息.
在这里,只是简单地返回TRUE.
*/
virtual BOOL OnSubmiting(PDU_SMPP_SUBMIT_SM _message);
/**发送SUBMIT消息成功时调用
*/
virtual void OnSubmited(PDU_SMPP_SUBMIT_SM _message);
/**发送SUBMIT消息失败时调用
*/
virtual void OnSubmitFailed(PDU_SMPP_SUBMIT_SM _message/*, unsigned nResult*/);
/**收到CONNECT_RESPONSE时调用
*/
virtual void OnReceivedConnectResponse(PDU_SMPP_BIND_RESP _message);
/**收到Terminate消息时调用
*/
virtual void OnReceivedTerminate();
/**收到SUBMIT_RESPONSE时调用
*/
virtual void OnReceivedSubmitResponse(PDU_SMPP_SUBMIT_SM_RESP _message);
/**收到Deliver消息时调用
*/
virtual void OnReceivedDeliver(PDU_SMPP_DELIVER_SM _message);
/**输出日志时调用
格式化输出日志,默认是把内容//TRACE出来
*/
virtual void OnLogWrite(const char * pchFmt, ...);
//@}
BOOL isOK;
/**清除连接
*/
void Clear();
protected:
/**初始化变量
*/
void Initialize();
/**建立网关连接
*/
int CreateConnection();
/**连接并尝试登录网关
*/
int Bind();
/**断开连接
*/
void Unbind();
/**接收SMG方面的所有消息
*/
inline int RecvSmscMsg(
PDU_SMPP_SMSC_TO_ESME * message,
unsigned long & nResult
);
/**用于接收消息
*/
static DWORD WINAPI RecvFunc(LPVOID pParam);
virtual DWORD RecvProc();
private:
//protected:
SMPPClient & client; ///< 所属client
char token[MAX_PATH]; ///< 连接ID(YYMMDDhhmmsslll)
char server_host[MAX_PATH]; ///< 网关地址
unsigned short server_port; ///< 网关端口
unsigned char interface_version; ///< 网关支持的最高版本号
char system_id[MAX_PATH]; ///< 网关登录用户名
char password[MAX_PATH]; ///< 网关登录口令
ConnectionType conntype; ///< 网关连接类型
char system_type[MAX_PATH];
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; ///< 状态报告数
};
///////////////////////////////////////////////////////////////////////////////
//
class CJobSmpp : public IJobDesc {
public:
CJobSmpp(SMPPClient & _client, SMPPConnection & _connection, JobType _type);
CJobSmpp(SMPPClient & _client, SMPPConnection & _connection, JobType _type, PDU_SMPP_SUBMIT_SM_RESP _message);
CJobSmpp(SMPPClient & _client, SMPPConnection & _connection, JobType _type, PDU_SMPP_DELIVER_SM _message);
~CJobSmpp();
void OnSendSubmit();
void OnSubmitSucceed();
void OnDeliver();
void OnTerminate();
void OnConnectResponse();
void OnSubmitFailed();
void OnSubmitResponse();
void OnSubmiting();
JobType type;
protected:
SMPPClient & client;
SMPPConnection & connection;
PDU_SMPP_SUBMIT_DELIVER_SM sdMsg;
//PDU_SMPP_DELIVER_SM deliverMsg;
PDU_SMPP_BIND_RESP connectRespMsg;
PDU_SMPP_SUBMIT_DELIVER_SM_RESP sdRespMsg;
//int nResult;
};
class CWorkerSmpp:public IWorker {
virtual void ProcessJob( IJobDesc* pJobDesc );
};
///////////////////////////////////////////////////////////////////////////////
//
typedef std::list<SMPPConnection*> aList;
class SMPPClient
{
public:
/**@name Construction */
//@{
SMPPClient();
virtual ~SMPPClient();
//@}
/**@name GetFunctions */
//@{
/**得到提交的SUBMIT消息数
*/
long GetSubmitCount() const
{ return submitCountTotal; }
/**得到发送成功的SUBMIT消息数
*/
long GetSubmitSucceedCount() const
{ return submitSucceedCountTotal; }
/**得到发送失败的SUBMIT消息数
*/
long GetSubmitFailedCount() const
{ return submitFailedCountTotal; }
/**得到失败的SUBMITResponse消息数
*/
long GetRespFailedCount() const
{ return respFailedCountTotal; }
/**得到成功的SUBMITResponse消息数
*/
long GetRespSucceedCount() const
{ return respSucceedCountTotal; }
/**得到收到的Deliver消息数
*/
long GetDeliverCount() const
{ return deliverCountTotal; }
//@}
/**@name Main Functions */
//@{
/**初始化Client函数.
注意: 每个Client在进行所有操作之前必须调用Initialize()进行初始化操作
@param nMinWorkThreadsCount 指定线程池要启用的初始线程数
@param nMaxWorkThreadsCount 指定线程池允许使用的最大线程数
*/
void Initialize(
unsigned nMinWorkThreadsCount = 4,
unsigned nMaxWorkThreadsCount = 8
);
/**建立一个连接
@param _smghost 要连接的网关地址
@param _smgport 要连接的网关端口号
@param _username 登录用户名
@param _password 登录口令
@param _icpid 企业代码
@param _conntype 连接类型
@param _isAsiaInfoSmg 是否是亚信网关
@param _nActivetestInterval 活动测试时间间隔
@param sync 是否同时登录网关(一般填TRUE)
@return 如果成功连接的话,'''''''''''''''''''''''''''''''''''''''''''''']
返回该连接的指针
*/
SMPPConnection * MakeConnection(
const char * _smschost,
const unsigned short & _smscport,
const ConnectionType & _conntype,
const char * _username,
const char * _password,
const char * _systemtype,
const unsigned char & _interfaceversion,
const int & _nActivetestInterval,
BOOL sync
);
/**停止网关服务
*/
virtual void Release();
/**清除连接
*/
void ClearConnection(const char * token);
/**清除当前Client中的所有连接
*/
void ClearAllConnections();
/**发送一条Submit消息
*/
int Submit(PDU_SMPP_SUBMIT_SM & message);
//@}
/**@name Callback functions */
//@{
/**登录网关成功时调用
*/
virtual void OnConnectionLogined(SMPPConnection & connection)
{
return;
}
/**登录网关失败时调用
*/
virtual void OnConnectionLoginFailed(
SMPPConnection & connection,
int errorCode
)
{
return;
}
/**同网关连接断开时调用
*/
virtual void OnConnectionCleared(SMPPConnection & connection)
{
return;
}
/**发送SUBMIT消息前调用,如果返回失败,则停止发送SUBMIT消息.
在这里,只是简单地返回TRUE.
*/
virtual BOOL OnConnectionSubmiting(
SMPPConnection & connection,
PDU_SMPP_SUBMIT_SM _message
)
{
return TRUE;
}
/**发送SUBMIT消息成功时调用
*/
virtual void OnConnectionSubmited(
SMPPConnection & connection,
PDU_SMPP_SUBMIT_SM _message
)
{
return;
}
/**发送SUBMIT消息失败时调用
*/
virtual void OnConnectionSubmitFailed(
SMPPConnection & connection,
PDU_SMPP_SUBMIT_SM _message
)
{
return;
}
/**收到CONNECT_RESPONSE时调用
*/
virtual void OnReceivedConnectionConnectResponse(
SMPPConnection & connection,
PDU_SMPP_BIND_RESP _message
)
{
return;;
}
/**收到Terminate消息时调用
*/
virtual void OnReceivedConnectionTerminate(SMPPConnection & connection)
{
return;
}
/**收到SUBMIT_RESPONSE时调用
*/
virtual void OnReceivedConnectionSubmitResponse(
SMPPConnection & connection,
PDU_SMPP_SUBMIT_SM_RESP _message
)
{
return;
}
/**收到Deliver消息时调用
*/
virtual void OnReceivedConnectionDeliver(
SMPPConnection & connection,
PDU_SMPP_DELIVER_SM _message
)
{
return;
}
/**输出日志时调用
格式化输出日志,默认是把内容//TRACE出来
*/
virtual void OnConnectionLogWrite(SMPPConnection & connection, const char * str);
//@}
public:
/**@name JobProcess functions */
//@{
BOOL ProcessConnectionSubmiting(
SMPPConnection & connection,
PDU_SMPP_SUBMIT_SM _message
);
void ProcessConnectionSubmited(
SMPPConnection & connection,
PDU_SMPP_SUBMIT_SM _message
);
void ProcessConnectionSubmitFailed(
SMPPConnection & connection,
PDU_SMPP_SUBMIT_SM _message
);
void ProcessReceivedConnectionConnectResponse(
SMPPConnection & connection,
PDU_SMPP_BIND_RESP _message
);
void ProcessReceivedConnectionTerminate(SMPPConnection & connection);
void ProcessReceivedConnectionSubmitResponse(
SMPPConnection & connection,
PDU_SMPP_SUBMIT_SM_RESP _message
);
void ProcessReceivedConnectionDeliver(
SMPPConnection & connection,
PDU_SMPP_DELIVER_SM _message
);
protected:
/**创建一个连接token
*/
const char * CreateToken() const;
/**找到第一个可用的连接
*/
SMPPConnection * firstFitRouter(int start);
/**循环使用可用的连接
*/
SMPPConnection * roundRobinRouter();
/**记录Client日志信息和connection日志信息,默认将所有信息发送到调试窗口(Debug模式下)
*/
virtual void LogWrite(const char * pchFmt, ...);
private:
CThreadPool m_pool;
CWorkerSmpp m_worker;
CJobSmpp * m_pJob;
aList connectionList;
MyCriticalSection m_listCS;
SMPPConnection * lastPick;
int m_nMinWorkThreadsCount;
int m_nMaxWorkThreadsCount;
BOOL m_fStarted;
long submitCountTotal;
long submitSucceedCountTotal;
long submitFailedCountTotal;
long respSucceedCountTotal;
long respFailedCountTotal;
long deliverCountTotal;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -