📄 commonsms.h
字号:
#ifndef _COMMON_SMS_H_
#define _COMMON_SMS_H_
#include <winsock2.h>
struct SUBMIT_SMS //结构长度为512字节
{
int protrol; //运营商协议 0- 移动,1-联通2-网通3-电信,4-短信猫
__int64 msgId; //消息id
int pkSeqId; //消息Id所在包的流水序号
int len; //消息长度
int result; //发送结果
char smgMsgId[24]; //网关返回的唯一标识
char pkg[464]; //消息包体
};
struct DELIVER_SMS
{
int protrol; //运营商协议 0- 移动,1-联通2-网通3-电信,4-短信猫
char corpId[12]; //企业代码
char srcTermid[24]; //服务代码
char destTermid[24]; //服务代码
char smgMsgId[24]; //网关的唯一标识
int msgFormat; //消息格式
char msgContent[256]; //接收内容
char linkId[24]; //临时定购关系
};
struct MTREPORT_SMS
{
int protrol; //运营商协议 0- 移动,1-联通2-网通3-电信,4-短信猫
char corpId[12]; //企业代码
char srcTermid[24]; //服务代码
char destTermid[24]; //服务代码
char smgMsgId[24]; //网关的唯一标识
char state[8]; //返回结果
int errorCode; //发送结果
};
struct WND_DATA
{
long time; //发送时间
int send; //事发发送 0- 未发送,1-发送成功,2-发送失败
int trys; //重发次数
SUBMIT_SMS *lpBuff; //发送缓冲区
int len; //发送缓冲区长度
int seqid; //消息流水号
};
class CCommonSMS
{
public:
static long m_Instance;
public:
CCommonSMS();
~CCommonSMS();
protected:
bool m_bQuit;
int m_nThreadPools; //线程数量
int m_nWndSize; //发送窗口数量
int m_nTimeOut; //超时时间
int m_nTrys; //重发次数
int m_nNextEventIndex; //循环监听下个事件的起点索引
long m_threadpoolsinstance; //线程实例数量,当为0时释放
HANDLE *m_phSemaphoreWnd; //线程信号量,控制发送窗口大小
HANDLE *m_phWaitSubmitEvent; //线程发送事件
HANDLE *m_phThreadPool; //线程句柄数组
WND_DATA* m_pWndData; //发送数据结构
HANDLE m_hQuitEvent; //等待退出事件
HANDLE m_hRecvThread; //接收线程
HANDLE m_hActiveThread; //检测线程
protected:
void (*m_OnDeliverSMS)(DELIVER_SMS *pDeliver);
void (*m_OnMTReportSMS)(MTREPORT_SMS *pReport);
void (*m_OnSubmitedSMS)(SUBMIT_SMS *pSubmited);
protected:
unsigned int m_nMaxSeqId;
int m_nWndBits;
unsigned int m_nSeqId;
CRITICAL_SECTION m_csSeqId;
SOCKET m_Socket;
CRITICAL_SECTION m_csSocket;
protected:
char m_szIp[32];
int m_nPort;
char m_szUser[16];
char m_szPwd[16];
char m_szCorpId[16];
char m_szSeverNumber[24];
char m_szSpNode[12];
int m_nLoginMode;
public:
int Connect();
virtual void OnSocketError();
virtual int Login();
virtual int Logout();
protected:
int GetSeqid(int index);
char* GetTimeStamp( char *buf); //生成时间戳MMDDHHmmMISS
protected:
int Initialize(int threadpools, int wndsize,int timeout,int retrys);
int Close();
int AddThreadPoolInstance(); //管理线程池,增加一个实例加一
int ReleaseThreadPoolInstance(); //管理线程池,减少一个实例减一0释放
void OnDeliverSMS(DELIVER_SMS *pDeliver);
void OnMTReportSMS(MTREPORT_SMS *pReport);
int Send(char *buff ,int len); //发送函数
void OnSubmitedSMS(SUBMIT_SMS * p); //发送消息结束
void OnSubmitResp(int seqid,int result,char *smgMsgId);//接收到消息应答
virtual int SubmitSMS(SUBMIT_SMS *p ,int len,int seqid); //发送函数
static unsigned long _stdcall ThreadRecvProc(void *lpvoid);
static unsigned long _stdcall ThreadActiveProc(void *lpvoid);
virtual void OnRecv();
virtual void OnActive();
public:
int OnSubmitSMS(SUBMIT_SMS *p,int len); //收到发送消息
protected:
class CThreadPool
{
public:
CThreadPool();
~CThreadPool();
public:
CCommonSMS *m_pParent;
bool m_bQuit; //通知线程退出
int m_nThreadIndex; //发送线程索引
int m_nWaitSendCounts; //待发送数量
long m_nWndIdles; //窗口空闲数量
CRITICAL_SECTION m_csWnd; //窗口线程互斥区
public:
static unsigned long _stdcall ThreadPoolProc(void *lpvoid);
void Run();
SUBMIT_SMS * ReleasesWndData(int seqid);
void AddWndData(SUBMIT_SMS * p ,int len );
private:
} *m_pThreadPool;
friend class CThreadPool;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -