64,682
社区成员
发帖
与我相关
我的任务
分享
//判断如果非正常连接状态,则不执行以下代码,
// 先接收包头部分,以确定包的大小、类型
nRecvLen = pSGIPSocket->RECV( (char *)&sgipPack.head, sizeof(sgipPack.head),nErrCode);//第一次是能接收到正常包头的,
if( nRecvLen != sizeof( sgipPack.head))
{
continue;
}
// 接收包体
nRecvLen = pSGIPSocket->RECV(sgipPack.data, ntohl( sgipPack.head.Message_Length )-sizeof(sgipPack.head),nErrCode);
if(nRecvLen == SOCKET_ERROR)
{
continue;
}//第一次也是能正确接收到包体的。。。。。。
LOG_DEBUG("RECV response");
switch (ntohl(sgipPack.head.Command_Id))
{
//发送短信回应
case nSGIP_SUBMIT_RESP:
{
SGIP_SUBMIT_RESP &smtrsp=*(SGIP_SUBMIT_RESP *)&sgipPack.data;
if (nRecvLen!=sizeof(SGIP_SUBMIT_RESP))
{//收到发短信返回包长不对
LOG_ERROR("SGIP_SUBMIT_RESP length Error:"<<nRecvLen);
break;
}
LOG_DEBUG("recv submit resp");
// 申请已经发送了的数据使用权
EnterCriticalSection( &pSGIPSocket->m_csSendingList);
std::list<SGIP_PACKAGE>::iterator iter = pSGIPSocket->m_SendedList.begin();
SGIP_PACKAGE sgipPackTemp;
while ((iter != pSGIPSocket->m_SendedList.end()))
{
sgipPackTemp =( *iter);
sgipPackTemp.t+=60;
LOG_DEBUG(ntohl(sgipPackTemp.head.Sequence_Id)<<":"<<(int)smtrsp.Result<<":"<<ntohl(sgipPack.head.Sequence_Id));//这里第一次返回都是正确的,包括发送的结果。。。。
if (sgipPackTemp.head.Sequence_Id == sgipPack.head.Sequence_Id)
{//已经发到网关
LOG_DEBUG("Send msg to SMGW:"<<ntohl(sgipPackTemp.head.Sequence_Id));
if (pSGIPSocket->m_pfnCallback != NULL)
{
//CMPP_SENDIMG sendimg;
//sendimg.dwSequence_Id = htonl(cmppPack.head.dwSequence_Id);
//sendimg.msgid = pCmpp->hton64(smtrsp.msgid);
//sendimg.byResult = smtrsp.byResult;
pSGIPSocket->m_pfnCallback(CECMPP_SEND_IMG,0,0);
}
if (smtrsp.Result !=0)
{//失败
LOG_ERROR("Send msg to SMGW Error:"<<(int)smtrsp.Result);
pSGIPSocket->FailSMSPackToLOG(sgipPackTemp);
}
{
//短信回应应答
SGIP_PACKAGE pkg;
int len=sizeof(SGIP_HEAD)+sizeof(SGIP_SUBMIT_RESP);
memset(&pkg,0,sizeof(pkg));
pSGIPSocket->InitHead(&(pkg.head),nSGIP_SUBMIT_RESP,len);
SGIP_SUBMIT_RESP resp;
memset(&resp,0,sizeof(resp));
resp.Result=smtrsp.Result;
char *pos=pkg.data;
memcpy(pos,&(pkg.head),sizeof(pkg.head));
pos+=sizeof(pkg.head);
memcpy(pos,&resp,sizeof(resp));
pSGIPSocket->m_SendingList.push_back(pkg);
}
pSGIPSocket->m_SendedList.erase(iter);
break;
}
else if (sgipPackTemp.t <= time( NULL))
{//发送的时间是超过60秒
//删除
iter = pSGIPSocket->m_SendedList.erase(iter);
if (sgipPackTemp.n >0)
{//小于三次。重发
sgipPackTemp.n--;
sgipPackTemp.IsSend = FALSE;
pSGIPSocket->m_SendingList.push_back(sgipPackTemp);
}
else
{//发三次失败
pSGIPSocket->FailSMSPackToLOG(sgipPackTemp);
}
continue;
}
iter++;
}
LeaveCriticalSection( &pSGIPSocket->m_csSendingList);
break;
}