示例#1
0
int CSvrLink::Processing(ST_BUNIT *pBUnit)
{
   int rtn;
   MSGBUF *pmb;
   RP_REQUEST rp;

   if (linksock.IsFree())
      return(0);
   rp.iGRFrame = iGRFrame;
   rp.iLastReqType = htonl(iLastReqType);
   rp.iLastRetCode = htonl(iLastRetCode);
   rtn = SendMsg(MT_GETREQ,sizeof(rp),&rp);
   if (rtn!=0)
   {
      // 连接出现问题了:或被BCC关闭了
      return(-1);
   }
   rtn = RecvMsg(pBUnit->iHBInterval);
   if (rtn>=(int)(sizeof(MSGHEAD)))
   {
      pmb = GetRecvMsg();
      switch (pmb->head.msgtype)
      {
      case MT_LINKBEGIN:
         // Update some variables:
         if (pmb->head.len>=sizeof(AP_LINKBEGIN))
         {
            AP_LINKBEGIN *pap;
            pap = (AP_LINKBEGIN *)(pmb->data);
            svr_hs1 = pap->bc1;
            iThisProcID = ntohl(pap->bu_number);
         }
         break;
      case EXITMSGTYPE:
         Close();
         bExit = true;
         break;
      case WRITEAPPINFO:
         WriteAppInfo(bccBFuncNo,bccID);   // 在主框架程序部分
         break;
      case MT_GETREQ:
         // OK,have new request to process
         if (pmb->head.len>=sizeof(AP_REQUEST)+sizeof(ST_PACKHEAD))
         {
            AP_REQUEST *prp = (AP_REQUEST *)(pmb->data);
            if (prp->iGRFrame==iGRFrame)
            {
               CallBPFunction(pmb);
               iGRFrame++;
            }
         }
         break;
      default:
         break;
      }
   }
   return(rtn);
}
示例#2
0
int CSvrLink::Processing(ST_BUNIT *pBUnit)
{
   int rtn;
   MSGBUF *pmb;
   RP_REQUEST rp;

   if (linksock.IsFree())
      return(0);
   rp.iGRFrame = iGRFrame;
   rp.iLastReqType = htonl(iLastReqType);
   rp.iLastRetCode = htonl(iLastRetCode);
   rtn = SendMsg(MT_GETREQ,sizeof(rp),&rp);
   if (rtn!=0)
   {
      // 连接出现问题了:或被BCC关闭了
      return(-1);
   }
GETNEXTMSG:
   rtn = RecvMsg(pBUnit->iHBInterval);
   if (rtn>=(int)(sizeof(MSGHEAD)))
   {
      pmb = GetRecvMsg();
      switch (pmb->head.msgtype)
      {
      case MT_LINKBEGIN:
         // Update some variables:
         if (pmb->head.len>=sizeof(AP_LINKBEGIN))
         {
            AP_LINKBEGIN *pap;
            pap = (AP_LINKBEGIN *)(pmb->data);
            svr_hs1 = pap->bc1;
            iThisProcID = ntohl(pap->bu_number);
         }
         break;
      case EXITMSGTYPE:
         Close();
         bExit = true;
         break;
      case WRITEAPPINFO:
         (*pWriteAppInfo)(bccBFuncNo,bccID);   // 在主框架程序部分
         break;
      case MT_GETREQ:
         // OK,have new request to process
         if (pmb->head.len>=sizeof(AP_REQUEST)+sizeof(ST_PACKHEAD))
         {
            AP_REQUEST *prp = (AP_REQUEST *)(pmb->data);
            if (prp->iGRFrame==iGRFrame)
            {
               CallBPFunction(pmb);
               iGRFrame++;
            }
         }
         break;
      /* ****** Updated by CHENYH at 2005-10-24 14:29:13 ****** */
      // 当BU用CheckLink()发送MT_TESTLINK心跳检查的时候,BCC给BU反馈一个心跳检查应答,
      // 当BU用CheckLink()命令的时候,应该用tc2_tc1(GetTickCount(),m_lastrcvtick)与pBUnit->iHBInterval×2来比较
      // BCC与BU在不稳定网络下,链路是否正常的。
      case MT_TESTLINK:
         goto GETNEXTMSG;  // 仅仅作为当BU给BCC发送MT_TESTLINK心跳检查时候,BCC给BU的心跳检查应答
         break;
      /*******************************************************/
      default:
         break;
      }
   }
   return(rtn);
}