📄 sgip_function.cpp
字号:
sthead.nTotalLength = nSize; // 消息总长度(包括消息头)
sthead.nCommandId = SGIP_SUBMIT; // 命令字
sthead.nSequenceId.nSrcNodeNum = conn->nSrcNum; // 源节点编号
sthead.nSequenceId.nDateTime = nDateTime; // 日期时间,如:1120203225
sthead.nSequenceId.nSeqId = nSeq; // 序列号
char *sBuffer = new char[nSize];
memcpy(sBuffer, &sthead, SGIP_HEADLEN);
memcpy(sBuffer + SGIP_HEADLEN, ss, SGIP_SUBMITLEN);
int iRet;
iRet = sgip_socket_send(conn->hSocket, sBuffer, nSize);
if (iRet != 0 )
{
return -1;
}
int nTimeOut = 100;
sgipg_packet sp;
//submit_response 等待recv返回,如果返回的不是该条
iRet = sgip_recv(conn, &sp, nTimeOut);
if (iRet != 0)
{
return -1;
}
// 0:成功,1:用户名密码错误,2:重复登录,3:连接过多(更多错误码看协议)
int iResult = atoi((char*)sp.pk_data.pk_resp.cResult);
if (iResult != 0)
return -1;
return 0;
}
/*
接收包处理,注意接受所有的包下来
*/
int sgip_recv(sgip_conn* conn, sgipg_packet* sp, unsigned int nTimeOut)
{
int iRet;
int iReadLen = 0;
char Length[4];
char* pBuf = NULL;
while( iReadLen < 4 )
{
iRet = sgip_socket_recv(conn->hSocket, Length + iReadLen , 4 - iReadLen );
if( iRet == 0 )
return -1;
if( iRet == SOCKET_ERROR )
{
iRet = GetLastError();
return -1;
}
iReadLen += iRet;
}
int iLen;
memcpy(&iLen, Length, 4);
iLen = ntohl( iLen );
//读取包体到buffer中
pBuf = new char[iLen];
memcpy( pBuf, Length, 4 );
while( iReadLen < iLen)
{
iRet = sgip_socket_recv(conn->hSocket, pBuf + iReadLen , iLen - iReadLen);
if( iRet == 0 )
{
delete pBuf;
return -1;
}
if( iRet == SOCKET_ERROR )
{
iRet = GetLastError();
delete pBuf;
return -1;
}
iReadLen += iRet;
}
//开始解压buf到结构体中
memcpy(&sp->pk_head, pBuf, SGIP_HEADLEN);
sp->pk_head.nTotalLength = ntohl( sp->pk_head.nTotalLength);
sp->pk_head.nCommandId = ntohl(sp->pk_head.nCommandId);
sp->pk_head.nSequenceId.nSrcNodeNum = ntohl(sp->pk_head.nSequenceId.nSrcNodeNum );
sp->pk_head.nSequenceId.nDateTime = ntohl( sp->pk_head.nSequenceId.nDateTime );
sp->pk_head.nSequenceId.nSeqId = ntohl( sp->pk_head.nSequenceId.nSeqId );
//解包体
memcpy(&sp->pk_data, pBuf + SGIP_HEADLEN, iLen - SGIP_HEADLEN);
return iRet;
}
/*
上行解包处理 ??
*/
int sgip_deliver(sgip_conn* conn, sgipg_deliver* sd)
{
return 0;
}
/*
发送reponse响应消息
*/
int sgip_auto_resp(sgip_conn* conn, sgipg_head* sh, unsigned int nResult )
{
if (sh->nCommandId == 0)
return SGIP_EINVAL;
sgipg_head *sthead = sh; //包头信息
int nSize = SGIP_RESPLEN + SGIP_HEADLEN;
sthead->nTotalLength = nSize; // 消息总长度(包括消息头)
sgipg_resp ss;
memset(&ss, 0, sizeof(ss));
sprintf((char*)ss.cResult, "%d", nResult);
char *sBuffer = new char[nSize];
memcpy(sBuffer, sthead, SGIP_HEADLEN);
memcpy(sBuffer + SGIP_HEADLEN, &ss, SGIP_RESPLEN);
int iRet;
iRet = sgip_socket_send(conn->hSocket, sBuffer, nSize);
if (iRet != 0 )
{
return -1;
}
return 0;
}
/****************************************************************
初始化发送信息体
其实组合一个submit包
*/
int sgip_submit_sm_init(sgipg_submit* cs)
{
memset(cs, 0, sizeof(cs));
return 0;
}
/*
设置 sSpNumber[21]; // sp的接入号码
*/
int sgip_submit_sm_set_spnumber(sgipg_submit* cs, const char* sSpNumber, unsigned int nSize)
{
strncpy(cs->sSpNumber , sSpNumber, nSize);
return 0;
}
/*
sChargeNumber[21]; // 付费号码
*/
int sgip_submit_sm_set_chargenumber(sgipg_submit* cs, const char* sChargeNumber, unsigned int nSize)
{
strncpy(cs->sChargeNumber, sChargeNumber, nSize);
return 0;
}
/*
接收短消息的手机数量
*/
int sgip_submit_sm_set_usercount(sgipg_submit* cs, unsigned char cUserCount)
{
cs->cUserCount = cUserCount;
return 0;
}
/*
char sUserNumber[21*100]; // 接受该短消息的手机号
*/
int sgip_submit_sm_set_usernumber(sgipg_submit* cs, const char *sUserNumber, unsigned int nSize)
{
strncpy(cs->sUserNumber, sUserNumber, nSize);
return 0;
}
/*
群发功能
*/
int sgip_submit_sm_add_usernumber(sgipg_submit* cs, const char *sUserNumber)
{
strcat(cs->sUserNumber, "|");
strcat(cs->sUserNumber, sUserNumber);
return 0;
}
/*
企业代码,0-99999
*/
int sgip_submit_sm_set_corpid(sgipg_submit* cs, const char* sCorpId, unsigned int nSize)
{
strncpy(cs->sCorpId, sCorpId, nSize);
return 0;
}
/*
sServiceType[10]; 业务代码,由sp定义
*/
int sgip_submit_sm_set_servicetype(sgipg_submit* cs, const char* sServiceType, unsigned int nSize)
{
strncpy(cs->sServiceType, sServiceType, nSize);
return 0;
}
/*
设置收费类型 unsigned char cFeeType; 计费类型
*/
int sgip_submit_sm_set_feetype(sgipg_submit* cs, unsigned char cFeeType)
{
cs->cFeeType = cFeeType;
return 0;
}
/*
sFeeValue[6]; // 该条短消息的收费值,单位为分
*/
int sgip_submit_sm_set_feevalue(sgipg_submit* cs, const char* sFeeValue, unsigned int nSize)
{
strncpy(cs->sFeeValue, sFeeValue, nSize);
return 0;
}
/*
sGivenValue[6]; // 赠送用户的话费,0-99999
*/
int sgip_submit_sm_set_givenvalue(sgipg_submit* cs, const char* sGivenValue, unsigned int nSize)
{
strncpy(cs->sGivenValue, sGivenValue, nSize);
return 0;
}
/*
unsigned char cAgentFlag; // 代收费标志,0:应收;1:实收
*/
int sgip_submit_sm_set_agentflag(sgipg_submit* cs, unsigned char cAgentFlag)
{
cs->cAgentFlag = cAgentFlag;
return 0;
}
/*
unsigned char cMorelatetoMTFlag; // 引起MT消息的原因
*/
int sgip_submit_sm_set_morelatetomtflag(sgipg_submit* cs, unsigned char cMorelatetoMTFlag)
{
cs->cMorelatetoMTFlag = cMorelatetoMTFlag;
return 0;
}
/*
unsigned char cPriority; // 优先级0-9,从低到高
*/
int sgip_submit_sm_set_priority(sgipg_submit* cs, unsigned char cPriority)
{
cs->cPriority = cPriority;
return 0;
}
/*
char sExpireTime[16];
短消息寿命的终止时间,"yymmddhhmmsstnnp","tnnp"取固定值"032+"
*/
int sgip_submit_sm_set_expiretime(sgipg_submit* cs, unsigned int nValidMinutes)
{
//cs->nValidMinutes = nValidMinutes;
return 0;
}
/*
sScheduleTime[16]; // 定时发送时间
*/
int sgip_submit_sm_set_schuduletime(sgipg_submit* cs, const char* sSchuduleTime)
{
strcpy(cs->sScheduleTime , sSchuduleTime);
return 0;
}
/*
cReportFlag; // 状态报告标志,0-出错返回状态报告;1-总返回状态报告;2-不要状态报告;3...
*/
int sgip_submit_sm_set_reportflag(sgipg_submit* cs, unsigned char cReportFlag)
{
cs->cReportFlag = cReportFlag;
return 0;
}
/*
unsigned char cTpPid;
unsigned char cUdhi;
*/
int sgip_submit_sm_set_protoid(sgipg_submit* cs, unsigned char cTpPid, unsigned char cTpUdhi)
{
cs->cTpPid = cTpPid;
cs->cUdhi = cTpUdhi;
return 0;
}
/*
cMessageCoding; // 编码方式,0:Ascii;3:Write card;4:binary;8:ucs2;15:GBK
*/
int sgip_submit_sm_set_messagecoding(sgipg_submit* cs, unsigned char cMsgCoding)
{
cs->cMessageCoding = cMsgCoding;
return 0;
}
/*
cMessageType; // 0:短消息信息
*/
int sgip_submit_sm_set_messagetype(sgipg_submit* cs, unsigned char cMsgType)
{
cs->cMessageType = cMsgType;
return 0;
}
/*
短消息长度(不调用sgip_submit_sm_set_messagecontent,
而手动赋值的话,需要调用函数htonl()转换为网络字节序)
*/
int sgip_submit_sm_set_messagecontent(sgipg_submit* cs, void *sMsgContent, unsigned int nSize)
{
char * pMsgContent = (char*)&cs->sMsgContent[0];
cs->nMsgLen = htonl(nSize);
strncpy((char*)cs->sMsgContent, (char*)sMsgContent, 160);
return 0;
}
/*
返回当前的格式时间
*/
int sgip_get_datetime()
{
int iTime =0;
CString sTime = CTime::GetCurrentTime().Format("%m%d%H%M%S");
iTime = atoi(sTime.GetBuffer(0));
return iTime;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -