免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4860 | 回复: 15
打印 上一主题 下一主题

某银行卡业务前置机代码片断 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-01-21 14:02 |只看该作者 |倒序浏览
#include "define.h"

int readn(int fd,void *vptr,int n);
void sigchld(int signo);

void main()
{
        int lsn_sock,nfds,i,flag,pid;
        short n,len,msg_len,net_msg_len;
        int my_pipe[2];
        struct accept_sock
        {
                int sock;
                int status;
        }conn_sock[MAX_CONNECTION_NUMBER];
        fd_set rset,rs;
        struct sockaddr_in saddr;
        char buf[1600];
        struct msg_buf
        {
                long mtype;
                char mtext[MAX_MSG_BUF_SIZE];
        }msg_buf;

        if(pipe(my_pipe)==-1)
        {        
                  printf("pipe error,%s\n",strerror(errno));
                  exit(1);
        }
        signal(SIGCHLD,sigchld);

        pid = fork();
        if(pid == -1)
        {
                printf("fork error,%s\n",strerror(errno));
                exit(1);
        }else if(pid == 0)
        {
                sprintf(buf,"%d",my_pipe[0]);
                if(execl("./bankinsvr","bankinsvr",buf,(char*)0)==-1)
                {
                        ;
                }
        }

        for(i = 0;i < MAX_CONNECTION_NUMBER; i++)
                conn_sock.status = CLOSED;

        nfds = -1;
        lsn_sock = socket(AF_INET,SOCK_STREAM,0);
        if(lsn_sock == -1)
        {
                printf("create listen socket error,%s\n",strerror(errno));
                exit(1);
        }

        flag = fcntl(lsn_sock,F_GETFL,0);
        fcntl(lsn_sock,F_SETFL,flag|O_NONBLOCK);
        bzero(&saddr,sizeof(saddr));
        saddr.sin_family = AF_INET;
        saddr.sin_port = htons(bank_port);
        saddr.sin_addr.s_addr = inet_addr(bank_ip_addr);
        if(bind(lsn_sock,(const struct sockaddr *)&saddr,sizeof(saddr))==-1)
        {
                printf("bind listen socket error,%s\n",strerror(errno));
                exit(2);
        }
        if(listen(lsn_sock,5) == -1)
        {
                printf("listen function error,%s\n",strerror(errno));
                exit(3);
        }
        FD_ZERO(&rset);
        FD_SET(lsn_sock,&rset);
        if(lsn_sock >; nfds )nfds = lsn_sock;
        while(1)
        {
                rs = rset;
                if(select(nfds+1,&rs,NULL,NULL,NULL)==-1)
                {
                        printf("select error!%s\n",strerror(errno));
                        exit(5);
                }
                for(i = 0;i<MAX_CONNECTION_NUMBER;i++)
                {
                        if(FD_ISSET(conn_sock.sock,&rs))
                        {
                                len = readn(conn_sock.sock,
                                        &net_msg_len,sizeof(short));
                                if(len<sizeof(short)&&len>;=0)
                                {
                                        /*connection is closed*/
                                        printf("银联通讯关闭!\n";
                                        conn_sock.status = CLOSED;
                                        FD_CLR(conn_sock.sock,&rset);
                                        close(conn_sock.sock);
                                        continue;
                                }else if(len < 0&&len != EWOULDBLOCK)
                                {
                                        /*read error*/
                                        printf("读数据出错[%s]!\n",
                                                strerror(errno));
                                        conn_sock.status = CLOSED;
                                        FD_CLR(conn_sock.sock,&rset);
                                        close(conn_sock.sock);
                                        continue;
                                }
                                msg_len = ntohs(net_msg_len);
                                len = readn(conn_sock.sock,
                                                buf,msg_len);
                                if(len < 0&& len != EWOULDBLOCK)
                                {
                                        printf("读数据出错[%d]!",errno);
                                        conn_sock.status = CLOSED;
                                        FD_CLR(conn_sock.sock,&rset);
                                        close(conn_sock.sock);
                                        continue;
                                }else if(len < msg_len&&len >;= 0)
                                {
                                        printf("读数据出错[%d]!",errno);
                                        conn_sock.status = CLOSED;
                                        FD_CLR(conn_sock.sock,&rset);
                                        close(conn_sock.sock);
                                        continue;
                                }
                                memcpy(msg_buf.mtext,buf,msg_len);
#ifdef DEBUG
                        printf("read request=[%s]\n",msg_buf.mtext);
#endif
                                if(write(my_pipe[1],msg_buf.mtext,
                                        sizeof(msg_buf.mtext))==-1)
                                {
                                        printf("写管道出错[%s]\n",
                                                strerror(errno));
                                }

                        }
                }
                if(FD_ISSET(lsn_sock,&rs))
                {
                        for(i = 0;i<MAX_CONNECTION_NUMBER;i++)
                        {
                                if(conn_sock.status == CLOSED)
                                {
                                        conn_sock.sock =
                                                accept(lsn_sock,NULL,NULL);
                                        if(conn_sock.sock == -1)
                                        {
                                                printf("accept error!%s\n"
                                                        ,strerror(errno));
                                                continue;
                                        }
                                        if(conn_sock.sock>;nfds)
                                                nfds = conn_sock.sock;
                                        flag = fcntl(conn_sock.sock,
                                                                F_GETFL,0);
                                        fcntl(conn_sock.sock,
                                                F_SETFL,flag|O_NONBLOCK);
                                        FD_SET(conn_sock.sock,&rset);
                                        conn_sock.status = IDLE;
                                        break;
                                }
                        }
                        if(i == MAX_CONNECTION_NUMBER)
                        {
                                printf("all conn socket is used!\n";
                                close(accept(lsn_sock,NULL,NULL));
                        }
                }
        }
}

int readn(int fd,void *vptr,int n)
{
        int nleft,nread;
        char *ptr;       

        ptr =vptr;
        nleft =n;
        while(nleft>;0)
        {
                if((nread = read(fd,ptr,nleft)) < 0 )
                {
                        if(errno == EINTR)
                                nread = 0;
                        else if(errno == EWOULDBLOCK)
                                continue;
                        else
                                return -1;
                }else if(nread == 0)           /* EOF */
                        break;
                nleft -= nread;
                ptr += nread;
        }
        return (n-nleft);
}

void sigchld(int signo)
{
        int status;
        if(signo == SIGCHLD)
                wait(&status);
        signal(SIGCHLD,sigchld);
}

论坛徽章:
0
2 [报告]
发表于 2004-01-21 14:06 |只看该作者

某银行卡业务前置机代码片断

/*******************************************************************
* 文件名        : utinit.c
* 文件功能      : 交易管理器启动程序
* 编程者        :
* 初作时间      :
* 修改纪录      :
* -----------------------------------------------------------------
* 编号                时间                注释
* 00
********************************************************************/

# include "unifytrade/utinc.h"

int nShmID = -1;
char *pAddr = NULL;
UT_ENV Ut_Env;

/*******************************************************************
* 函数名        :
* 函数功能      :
* 入口参数      :
* 出口参数      :
* 返回码        :
* 调用自定义函数:
* 处理概要      :
* 引用全局变量  :
* 修改的全局变量:
* 编程者        :
* 初作时间      :  * 修改纪录      :
* -----------------------------------------------------------------
* 编号                时间                注释
* /


main()
{
    int nRet;
    int nRet0, nRet1, nRet2;

    /** 初始化日志系统 */
    initLog(UT_SYS_NAME, UT_INIT_NAME, LOG_FATAL_ERROR);

    /** 读取环境变量 */
    if(( nRet = getUTEnvs()) < 0 ){
        sysLog(LOG_FATAL_ERROR,"无法读取属性变量,错误码=[%d],退出!\n",nRet);
        exit(0);
    }
    readUTEnvs(&Ut_Env);

    /** 重设日志级别 */
    setLogPriority(Ut_Env.Runtime_Log_Level);

    /** 检查共享内存是否存在 */
    if( isShmExist(UT_SHM_KEY) == 0 ){
        sysLog(LOG_FATAL_ERROR,"共享内存存在,退出!\n";
        exit(0);
    }

    /** 创建共享内存 */
    if ( createProcShm(MAX_MASTER_PROC,
                Ut_Env.Max_Sys_Job_Num,Ut_Env.Max_Cust_Job_Num) < 0){
        sysLog(LOG_FATAL_ERROR,"共享内存创建失败,退出!\n";
        printf("共享内存创建失败,退出!\n";
        exit(0);
    }

    nRet0 = execProc(UT_JOB_MGR_A_NAME, UT_NOWAIT, 0);
    nRet1 = execProc(UT_JOB_MGR_B_NAME, UT_NOWAIT, 0);
    nRet2 = execProc(UT_PROC_MGR_NAME, UT_NOWAIT, 0);

    if(nRet0 < 0 || nRet < 0 || nRet < 0){
        sysLog(LOG_FATAL_ERROR,
                "启动进程失败![%s=%d][%s=%d][%s=%d]\n",
                UT_JOB_MGR_A_NAME, nRet0,
                UT_JOB_MGR_B_NAME, nRet1,
                UT_PROC_MGR_NAME,  nRet2);
        printf("进程启动失败, 请检查日志文件[%s]。\n",UT_INIT_NAME);
    } else {
            printf("系统启动成功!\n";
    }
}

论坛徽章:
0
3 [报告]
发表于 2004-01-23 22:19 |只看该作者

某银行卡业务前置机代码片断

请问怎么得到的?网上有吗?/

论坛徽章:
0
4 [报告]
发表于 2004-01-24 17:45 |只看该作者

某银行卡业务前置机代码片断

这样做是不是效率很底,我们使用消息队列

论坛徽章:
0
5 [报告]
发表于 2004-01-24 18:39 |只看该作者

某银行卡业务前置机代码片断

使用管道只是一种方法,它主要用于有亲缘关系的进程间通信;而消息队列则不受其限制!我手头还有另外一家大行的前置代码,是用消息队列的!我对这两种出之不同银行的卡前置构架与设计文档和源码进行了仔细研究,发现其实都是大同小易,某些底层的东西无非都是源之于stevens的两本unix编程经典之作!很想多找几个人,在这种卡前置的基础上,开发出一套比较完美的大前置来!

论坛徽章:
0
6 [报告]
发表于 2004-01-24 18:44 |只看该作者

某银行卡业务前置机代码片断

这些东西我想网络上是很难找到的,都是本人在几年的参与开发与系统集成的过程中积累下来的!其实我想,这些都可以贡献给大学里计算机专业的本科生与研究生们!可惜还涉及到某些知识产权的东西!因为我想如果大学的软件专业直接用这些去作为教程与开发实例的话,一定能。。。。

论坛徽章:
0
7 [报告]
发表于 2004-01-24 18:53 |只看该作者

某银行卡业务前置机代码片断

//server 端
#define  "com.h"
# define   PKTRTNMSGLEN    16

#define LISTENPORT 8101

int RecvSock;                                /* 接收的套接字 */
int s;                                        /* 监听套接字 */
char reportdate[9];                        /* 报表日期 */
char createtime[30];                        /* 报表生成日期时间 */
char frptdate[5];

                        /* 报表名的日期 MMDD */




void settle_exit();
void f_child_exit();

int main()
{
    int iRet,len;
    int addrlen, i;
    char recbuffer[5000],fname[30];
    struct sockaddr_in peeraddr_in;

    char tmp[80];
   
    memset(recbuffer,0,sizeof(recbuffer));
    memset(fname,0,30);
    addrlen = sizeof(struct sockaddr_in);

    s=tcp_listen(LISTENPORT,5,5000);
    if(s<=0 )
    {
        perror("\nRequest init failed";
        return -1;
    }

    signal(SIGUSR1, settle_exit);        /* 设置信号启动退出函数 */
    strcpy(fname,"chenny.txt";
    while(1)
    {
        memset((char *)&peeraddr_in, 0, sizeof(struct sockaddr_in));
        RecvSock = accept(s, (struct sockaddr *)&peeraddr_in, &addrlen);
        if (RecvSock < 0)
        {                        /* accept()错误, 记录日志 */
            perror("accept error\n";
            sleep(1);
            continue;
        }
        switch(fork())
        {
          case -1:                /* fork()错误, 记录日志 */
            perror("fork error\n";
            sleep(1);
            break;
          case 0:                /* clild process */
            tcpclose(s);/* 关闭监控的套接字 */
            rec_data(RecvSock,recbuffer,fname);
            printf("receive recbuffer=[%s]\n",recbuffer);
            fflush(stdout);
            exit(0);
            break;
          default:                /* parent process */
            break;
        }
        tcpclose(RecvSock);        /* 关闭接收的套接字 */
    }
   
}

int rec_data(sock,RecData,filename)
int sock;
char *RecData,*filename;
{



   signal(SIGALRM, f_child_exit);
   cutblank(filename);
   if( strlen(filename) >;0 )
   {
      alarm(60);
      if ( rcvfile(sock,filename,120) ==0)
      {
        printf("接收文件[%s]成功!\n",filename);
        fflush(stdout);
      }
      else
      {
        sock_log("接收文件失败!",__LINE__,__FILE__);
        printf("接收文件失败[%s]!\n",filename);
        fflush(stdout);
        return -1;
      }
   }  

   if( RecData != NULL )
   {
     if ( RcvData(sock,RecData,20) == 0)
     {
       printf("接收数据成功!\n";
       printf("[%s]\n",RecData );
     }
     else
     {
        sock_log("接收数据失败!",__LINE__,__FILE__);
        printf("接收数据失败!\n";
        fflush(stdout);
        return -1;
     }
   }
   return 0;
}


void settle_exit()
{

    close(s);           /* 关闭监控的套接字 */
    close(RecvSock);                        /* 关闭接收套接字 */
    kill(0, SIGUSR1);                   /* kill all child processes */
    printf(" Settle Shutdown!\n";

    exit(0);
}

void f_child_exit()
{
    alarm(0);                                /* 取消连接超时设置 */
    signal(SIGALRM, SIG_IGN);

    close(RecvSock);                        /* 关闭接收套接字 */

    printf( "timeout!\n";

    exit(-1);
}


//client端
#include <com.h>;


main(argc,argv)
int     argc;
char    *argv[];
{


  char szServerAddr[16];
  int nzListeningPort;
  int sock,i;
  struct sockaddr_in serv_addr;
  char aczRecBuf[10],aczData[5000],recdata[5000];
  char temp[80],*tmp;
  struct chen{
         unsigned short chen4;
         char  chen1[10];
         long  chen3;
         char  chen2[10];
  }chen;
  
  strcpy(chen.chen1,"abcdefghi";
  strcpy(chen.chen2,"jklmnopqr";
  chen.chen3=123;
  chen.chen4=456;

  memset(&serv_addr,0,sizeof(serv_addr));
  memset(temp, 0, sizeof(temp));
  memset(aczData,0,sizeof(aczData));
  memset(recdata,0,sizeof(recdata));


  /* 发送 */
  sprintf(szServerAddr, "%s", "88.1.16.102");
  nzListeningPort = 7102;
  printf("Server addr=[%s], port=[%d]\n", szServerAddr, nzListeningPort);
     strcpy(aczData,"陈年以哦卡沃你打 I love you very much !\n");
     strcat(aczData,"毛主席好,你好我好大家好陈是猪头八,我要回去啦!!!!!");
     printf("%s,len=[%d]\n",aczData,strlen(aczData));
     fflush(stdout);


  memcpy(&tmp,&chen,sizeof(chen));  
  if ( send_recv2(szServerAddr,nzListeningPort,&tmp,sizeof(chen),&chen,sizeof(chen))==0)
  {
      printf("发送接收数据成功!\n");
      fflush(stdout);
      /*printf("\nrecdata=[%s]\n",recdata);*/
      printf("chen.chen1=[%s],chen.chen2=[%s]\n",chen.chen1,chen.chen2);
      printf("chen.chen3=[%d],chen.chen4=[%d]\n",chen.chen3,chen.chen4);
      fflush(stdout);
  }
  else
  {
    printf("发送接收数据失败!\n");
    fflush(stdout);
  }
  return;
}

论坛徽章:
0
8 [报告]
发表于 2004-01-24 21:30 |只看该作者

某银行卡业务前置机代码片断

abc的

论坛徽章:
0
9 [报告]
发表于 2004-01-25 01:06 |只看该作者

某银行卡业务前置机代码片断

没有define.h

可惜阿

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
10 [报告]
发表于 2004-01-25 01:12 |只看该作者

某银行卡业务前置机代码片断

一个完美的大潜置系统,其实不只是数据交换,还有更多的事情要做。

有实践的话,我参与你们的讨论。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP