⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sgip_function.cpp

📁 看到联通的接口协议的dll没
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	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 + -