📄 cmppsock.h
字号:
#if !defined(AFX_CMPPSOCK_H__7BAC9F1D_C0FE_406B_90F9_C32214152010__INCLUDED_)
#define AFX_CMPPSOCK_H__7BAC9F1D_C0FE_406B_90F9_C32214152010__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "global.h"
#pragma pack(1)
struct MESSAGE_HEAD
{
DWORD command_length ; //消息包的长度,包括消息头和消息体
DWORD command_id ; //表明命令或响应的类型
DWORD sequence_no ; //消息序号,它是命令和应答之间的对应标志,0到0XFFFFFFFF单调递增循环。
};
#define MAX_CMPP_COM_BUF 500
//#define PRINTOUT //printf
inline void PRINTOUT(const char* STR)
{
char STRA[400],timeChar[30]={0};
_strtime(timeChar);
sprintf(STRA,"%s--->%s",timeChar,STR);
// gl_svrsock.SendClientSme(STRA);
}
#define MAX_CMPP_HOSTNAME 16 //平台主机名最大长度
#define MAX_CMPP_USER 32 //用户名最大长度
#define MAX_CMPP_PASSWD 32 //登录密码最大长度
#define MAX_CMPP_ADD 20 //源发地址/目标地址最大长度
#define MAX_CMPP_MSGLEN 160 //所发短信最大长度,如为中文,应为160/4=40
#define MAX_CMPP_LOGINTIME 5 //登录最大超时时间()
#define MAX_CMPP_LOGOUTTIME 5 //退出最大超时时间
#define MAX_CMPP_SUBTIME 10 //发送短信最大超时时间
#define MAX_CMPP_ALIVETESTTIME 2
#include "md5.h"
class CCmppSock : public CSmsSock
{
private:
MD5_CTX md5;
UINT m_sequence; //消息序列号
WORD m_msgid; //信息标识
struct tagSMSCInfo
{
char SMSCIP[16];
UINT uPort;
char usrName[20];
char passWd[20];
}m_smscInfo;
public:
CCmppSock();
virtual ~CCmppSock();
public:
void Check();
int fReadAndAtuoAnswer();
int fDisconnect();
int fConnect(char* host,unsigned int port);
int fAliveTst(BOOL bResp=FALSE);
int fLogout(bool bResp=FALSE);
int fLogin(char* usrname,char* passwd);
int fSendSM(char* destadd,char* srcadd,char* sendmsg,bool bResp=FALSE);
int fReceive(BYTE* lpBuf, int nBufLen);
//void fShowErr(int nErrcode);
//{{AFX_VIRTUAL(CCmppSock)
//}}AFX_VIRTUAL
//{{AFX_MSG(CCmppSock)
//}}AFX_MSG
private:
void network_head(struct MESSAGE_HEAD* phead);
int fill_message(BYTE* pbody,const char* msg);
inline DWORD network_dword(DWORD v) //转换网络字节序
{
return ((v)<<24) | (((v)&0xff00)<<8) | (((v)>>8)&0xff00) | ((v)>>24);
}
int CreateSocket();
};
//命令码宏定义 数值 描述
#define CMPP_CONNECT 0X00000001 //ESME要求连接到SMSC
#define CMPP_CONNECT_REP 0X80000001 //连接SMSC的响应
#define CMPP_TERMINATE 0X00000002 //ESME要求断开连接到SMSC
#define CMPP_TERMINATE_REP 0X80000002 //断开连接的响应
#define CMPP_SUBMIT 0X00000004 //ESME提交短消息到SMSC,以便SMSC下发此短消息到特定的用户。
#define CMPP_SUBMIT_REP 0X80000004 //提交短消息的响应
#define CMPP_ACTIVE_TEST 0X00000008 //活动测试
#define CMPP_ACTIVE_TEST_REP 0X80000008 //活动测试应答
struct BODY_CMPP_CONNECT
{
char source_addr[6] ; //SP_ID
char authenticationSP[16]; //SP认证码
BYTE version ; //接口版本号
char reverse[8]; //保留
};
struct BODY_CMPP_CONNECT_REP
{
BYTE status; //状态 0-正确 1-消息结构错 2-非法SP_ID 3-SP认证错 4-版本高 5-其它
char authenticatinISMG[16]; //ISMG认证码,错误时为空
BYTE version; //服务器的最高版本
};
struct BODY_SUBMIT_SM //提交短消息
{
DWORD msg_id; //信息标识1~~FFFFFFFF
BYTE pk_total; //相同MSGID的消息总条数,从1开始
BYTE pk_number; //相同MSGID的消息序号,从1开始
BYTE registered_delivery; //是否返回状态报告0-不需要 1-需要 2-产生SMC话单
BYTE msg_level; //信息级别
char service_id[10]; //业务类型
BYTE fee_usertype; //计费用户类型字段 0对目的ISDN计费 1-对源ISDN 2-对SP计费
BYTE msg_fmt ; //消息格式 0-ASCII串 3-短信写卡操作 4-二进制信息 8-UCS2编码 15含GB汉字
char msg_src[6] ; //信息内容来源SP_ID
char feetype[2]; //资费类别
char feecode[6]; //资费代码(以分为单位)
char valid_time[17] ; //存活有效期,参见SMPP3.3
char at_time[17]; //定时发送时间
char src_terminal_id[21] ; //源发MSISDN号码(没有可以为空)
BYTE destusr_tl; //接收消息的用户数量(<100)
char dest_terminal_id[21];
BYTE msg_length; //
char msg_content[1]; //消息内容
char reserve[8]; //保锱
};
struct BODY_SUBMIT_SM_REP
{
DWORD msg_id; ////信息标识1~~FFFFFFFF,与提交对应
BYTE result; //结果 0-正确 1-消息结构错 2-命令字错 3-消息序号重复 4-消息长度错
//5-资费代码错 6-超过最大信息长 7-业务代码错 8-流量控制错 9-其它
};
//struct BODY_CMPP_TERMINATE 为空,只有消息头,无消息体
//struct BODY_CMPP_TERMINATE_REP 为空,只有消息头,无消息体
//struct BODY_ACTIVE_TEST此命令用于ESME确认和SMSC之间的连接。
//ESME发送一条ENQUIRE_LINK命令,SMSC响应一条ENQUIRE_LINK_ACK命令,表示ESME和SMSC之间的连接存在。
//此命令只有消息头,没有消息体,
//{{AFX_INSERT_LOCATION}}
#endif // !defined(AFX_NOKIASOCK_H__7BAC9F1D_C0FE_406B_90F9_C32214152010__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -