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

📄 scomm_cups.c

📁 异步程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <time.h>
#include "gaps_head.h"

typedef struct TAG_CTLMSG
{
  long mtype;
  int msglen;
  int pid;
  long msgtime;
  int stat;
}CTLMSG;

typedef struct TAG_MSG
{
     mtyp_t mtype;
     char mtext[MAX_PKG];
}TMSG;

#define COMMCLIINI "clicomm.ini"

#define MSGSTAT_SENDWAIT 1    /*消息状态:发送等待*/
#define MSGSTAT_SENDSUCC 2    /*消息状态:发送成功*/
#define MSGSTAT_RECVSUCC 6    /*消息状态:接收成功*/

#define MAXMSGLIVETIME   360     /*最大消息存活时间(十分钟)*/
int _WriteAbortmsg(int mtype,char *msgtext,int msglen,CTLMSG ctrlmsg);

IRESULT SCOMM_CUPS(HXMLTREE lXmlhandle)
{
	int iParas;
  char sCommbuf[MAX_PKG];
  char sBuf[MAX_PKG];
  char strBwlx[21];
  char sendflag[10];
  char szAddress[10];
  int  srlen,iPkglen;
  int  iRet; 
  
  fpub_InitSoComp(lXmlhandle);
  
  memset(strBwlx, 0, sizeof(strBwlx));
  memset(sendflag, 0, sizeof(sendflag));
  memset(szAddress, 0, sizeof(szAddress));
  COMP_PARACOUNTCHK(3)
  
  COMP_GETPARSEPARAS(1, strBwlx, "报文类型")
  COMP_GETPARSEPARAS(2, sendflag, "发送标记")
  COMP_GETPARSEPARAS(3, szAddress, "获取目的地")

  LOG(LM_DEBUG,Fmtmsg("组件[%s]执行开始",fpub_GetCompname(lXmlhandle)),"")  
  LOG(LM_DEBUG,Fmtmsg("报文类型[%s]!",strBwlx),fpub_GetCompname(lXmlhandle))  
  LOG(LM_DEBUG,Fmtmsg("发送标记[%s]!",sendflag),fpub_GetCompname(lXmlhandle))  
  LOG(LM_DEBUG,Fmtmsg("获取目的地[%s]!",szAddress),fpub_GetCompname(lXmlhandle))  
  trim(strBwlx);
  
  /*    设置报文数据内容到内部XML中 */  
  if((srlen=xml_GetBinElement(lXmlhandle,XMLNM_COMMBUF,sCommbuf,sizeof(sCommbuf)))<=0)
  {
      fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
           Fmtmsg(MSG_SYS_COMPEXEC,fpub_GetCompname(lXmlhandle)));
      fpub_SetCompStatus(lXmlhandle,-1);
      return -1;
  }
  /**/
  
  /*8583报文预处理*/
  if (strncmp(strBwlx,"8583",4) == 0) 
  {
  	memset(sBuf, 0, sizeof(sBuf));
  	sBuf[0] = 41;
  	sBuf[1] = 1;
  	sprintf(sBuf+2, "%4.4d00000000000000000000000000000000000", srlen+41);
  	memcpy(sBuf+41, sCommbuf, srlen);
  	memset(sCommbuf, 0, sizeof(sCommbuf));
  	memcpy(sCommbuf,sBuf,srlen+41);
  	srlen = srlen + 41;
  }
  if(sendflag[0]=='0')/*返回应答包*/
  {
      if((iRet=SndCUPS(szAddress, sCommbuf,sizeof(sCommbuf),&srlen))<0)
      {
        switch( iRet )
        {
        case -1:
          fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
               Fmtmsg("银联通讯发送失败",fpub_GetCompname(lXmlhandle)));
          break;
        case -3:
          fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
               Fmtmsg("银联通讯配置错误",fpub_GetCompname(lXmlhandle)));
          break;
        }
          fpub_SetCompStatus(lXmlhandle,iRet);
          return iRet;
      }
    
  }
  else/*发送请求包并接受返回*/
  {
      if((iRet=SndandRcvCUPS(szAddress, sCommbuf,sizeof(sCommbuf),&srlen))<0)
      {
        switch( iRet )
        {
        case -1:
          fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
               Fmtmsg("银联通讯发送失败",fpub_GetCompname(lXmlhandle)));
          break;
        case -2:
          fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
               Fmtmsg("银联通讯接收失败",fpub_GetCompname(lXmlhandle)));
          break;
        case -3:
          fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
               Fmtmsg("银联通讯配置错误",fpub_GetCompname(lXmlhandle)));
          break;
        }
          fpub_SetCompStatus(lXmlhandle,iRet);
          return iRet;
      }
      
        
      LOG(LM_STD,Fmtmsg("接收发卡系统应答成功!长度[%d]内容[%s]", srlen,sCommbuf), "")
      if(xml_SetBinElement(lXmlhandle,XMLNM_COMMBUF,sCommbuf,srlen)<0)
      {
          fpub_SetMsg(lXmlhandle,MID_SYS_COMPEXEC,
               Fmtmsg(MSG_SYS_COMPEXEC,fpub_GetCompname(lXmlhandle)));
          fpub_SetCompStatus(lXmlhandle,-2);
          return -2;
      }
  }
  /*    设置返回状态    */
  fpub_SetCompStatus(lXmlhandle,COMPSTATUS_SUCC);
  LOG(LM_DEBUG,Fmtmsg("组件[%s]执行结束",fpub_GetCompname(lXmlhandle)),"")    
  return 0;
}
static int iTimeout=0;
void Bitalarm()
{
  iTimeout=1;
  alarm(0);

}
/*************************************************
函数:SndCUPS
功能:发送交易应答到银联
参数:1.通讯缓冲
      2.通讯缓冲长度
      3.发送/接收长度
返回:
    =0  成功
    -1  发送错误
    -3  系统配置错误

    消息的键值指定方法:8583第11域跟踪号作为键值
*************************************************/
int SndCUPS(char *szAddress, char * buffer,int buflen,int * srlen)
{
  key_t msgskey,msgrkey,msgctrlkey;
  char sinifile[100],cfgbuf[100];
  int msgsid,msgrid,msgctrlid;
  int timeout,t0,ilen,ilen2,iret;
  char sFklsh[11];
  TMSG  Smsg,Rmsg;
  CTLMSG Sctlmsg;
  if(getenv("GAPSETCDIR")==NULL)
      snprintf(sinifile,sizeof(sinifile),"%s/etc/%s",getenv("HOME"),COMMCLIINI);
  else snprintf(sinifile,sizeof(sinifile),"%s/%s",getenv("GAPSETCDIR"),COMMCLIINI);

  memset(cfgbuf,0,sizeof(cfgbuf));
  if(ExGetCfgItem(sinifile,"CUPS","SNDMSGKEY",cfgbuf,sizeof(cfgbuf))<0)  
  {
  LOG(LM_DEBUG,Fmtmsg("银联处理[%s]配置文件配置项[%s]错误",sinifile,"SNDMSGKEY"),"")  
    return -3;
  }
  msgskey=atoi(cfgbuf);

  memset(cfgbuf,0,sizeof(cfgbuf));
  if(ExGetCfgItem(sinifile,"CUPS","RCVMSGKEY",cfgbuf,sizeof(cfgbuf))<0)  
  {
    LOG(LM_DEBUG,Fmtmsg("银联处理[%s]配置文件配置项[%s]错误",sinifile,"RCVMSGKEY"),"")  
    return -3;
  }
  msgrkey=atoi(cfgbuf);

  memset(cfgbuf,0,sizeof(cfgbuf));
  if(ExGetCfgItem(sinifile,"CUPS","CTRLMSGKEY",cfgbuf,sizeof(cfgbuf))<0)  
  {
    LOG(LM_DEBUG,Fmtmsg("银联处理[%s]配置文件配置项[%s]错误",sinifile,"CTRLMSGKEY"),"")  
    return -3;
  }
  msgctrlkey=atoi(cfgbuf);

  memset(cfgbuf,0,sizeof(cfgbuf));
  if(ExGetCfgItem(sinifile,"CUPS","TIMEOUT",cfgbuf,sizeof(cfgbuf))<0)  
  {
LOG(LM_DEBUG,Fmtmsg("银联处理[%s]配置文件配置项[%s]错误",sinifile,"TIMEOUT"),"")  
    return -3;
  }
  timeout=atoi(cfgbuf);

  if((msgsid=msgget(msgskey,0666))<0)
  {
    LOG(LM_DEBUG,Fmtmsg("银联处理通讯服务未启动"),"")  
    return -3;
  }
  
  memset(&Smsg, 0, sizeof(TMSG));
  Smsg.mtype=atol(szAddress);
  memcpy(Smsg.mtext,buffer,*srlen);


/*写控制队列*/
  memset(&Sctlmsg,0,sizeof(Sctlmsg));
  Sctlmsg.mtype=Smsg.mtype;
  Sctlmsg.msglen=*srlen;
  Sctlmsg.pid=getpid();
  Sctlmsg.msgtime=time(NULL);
  Sctlmsg.stat=MSGSTAT_SENDWAIT;
/*  if( (iret=msgsnd(msgctrlid,&Sctlmsg,sizeof(Sctlmsg)-sizeof(long),IPC_NOWAIT))!=0)
  {
    LOG(LM_DEBUG,Fmtmsg("Send err %d %d %d %d %s",msgctrlid,Smsg.mtype,iret,errno,strerror(errno)),"")
    return -1;
  }*/
/*写发送队列*/  
  if( (iret=msgsnd(msgsid,&Smsg,*srlen,IPC_NOWAIT))!=0)
  {
    LOG(LM_DEBUG,Fmtmsg("Send err %d %d %d %d %s",msgsid,Smsg.mtype,iret,errno,strerror(errno)),"")
/*    ilen=msgrcv(msgctrlid,&Sctlmsg,sizeof(Sctlmsg),Smsg.mtype,IPC_NOWAIT);*/
    return -1;
  }
  
  LOG(LM_DEBUG,Fmtmsg("sendlen=%d,mtype=%d",*srlen,Smsg.mtype),buffer)  
  
  return 0;
}

/**********************************************************
配置说明:相关的配置参数设置在etc下的clicomm.ini的CUPS区下
      具体内容如下:
[CUPS]
SNDMSGKEY=         #发送消息队列键值
RCVMSGKEY=         #接收消息队列键值
CTRLMSGKEY=        #控制消息队列键值
TIMEOUT=           #通讯超时时间
AMSGFILE=          #异常消息重定向文件,相对$HOME路径或绝对路径

  
***********************************************************/

/*************************************************
函数:SndandRcvCUPS
功能:发送交易请求到银联,并返回结果
参数:1.通讯缓冲
      2.通讯缓冲长度
      3.发送/接收长度
返回:
    =0  成功
    -1  发送错误
    -2  接收错误
    -3  系统配置错误

    消息的键值指定方法:8583第11域跟踪号作为键值

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -