#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVERLOG "/server.log"
#define CLNT_TYPE 1001
#define MSQID_IN 16051
#define MSQID_OUT 16052
#define MSQID_LOG 16053
/*���干���ڴ�*/
#define MOB_SHMID 16151
/*�������*/
#define MOB_SEMID 16152
#define MOB_SHMSIZE 128
typedef struct
{
int pid; /*�ͻ��˽��̺�*/
char uniqueid[32];
char txcode[7]; /*������*/
char buf[2048];
} comMsgBuf_t; /*ͨ����Ϣ���д���ṹ*/
typedef struct
{
int pid; /*�ͻ��˽��̺�*/
char uniqueid[32];
char txcode[7]; /*������*/
char sndbuf[256];
char revbuf[512];
} logMsgBuf_t; /*ͨ����Ϣ���д���ṹ*/
char TodayLog[128];
int dtime();
int getMsgTypes();
int testMsgQFull();
int RmMsg();
int comSleep();
int comMkShm();
int RmShm();
int DtShm();
int SemCall();
int SemSub();
int SemPlus();
int RmSem();
int comMkSem();
int InitMsg();
int comMsgSend();
int logMsgSend();
int clientMsgRecv();
int fvwf();
void onquitparent();
int monitormsg();
int monitorchild();
int findpiddied();
void onquitchild();
int mTETxStart();
int intochild();
int chkmsqarrInshm();
int gd_pidarr[128]; /*���̺�����,����ӽ��̺�*/
int gd_onquitchild_flg; /*��ֵΪ1ʱ�ӽ��̽��˳�*/
int gd_timeoutchild_flg; /*�ӽ��̽����ƶ����ij�ʱ��־*/
int gd_procnum; /*�ӽ�������*/
/*�ڹ����ڴ���ע��Ľ�����*/
int gd_regclientprocnum;
/*�ͻ��˽��̺ŵĴ洢�ڹ����ڴ�Max=128;*/
int *gd_pregprocarr;
/*�����ڴ�������*/
int gd_shmid;
/*���������*/
int gd_semid;
/*��Ϣ����������*/
int gd_msqid_in, gd_msqid_out, gd_msqid_log;
char gd_erline[256];
int main(argc, argv)
int argc;
char *argv[];
{
int pid, i, ret, procnum; /*�ӽ�����*/
int msqid_in, msqid_out;
void *p;
char sd[16], st[16];
dtime(st, sd);
sprintf(TodayLog, "%s.%s", SERVERLOG, sd+4);
if (strcmp(argv[1], "-?") == 0)
{
printf("������ȱʡ������Ϊ15!\n");
printf("ʹ�÷���:\n");
printf(" com2MobServer <�����Ľ�����>\n\n");
exit(0);
}
printf("\n\n");
if ((argc != 1) && (argc != 2)) exit(1);
if (fork() > 0) exit(0);
memset(gd_pidarr, 0, sizeof(gd_pidarr));
procnum = atoi(argv[1]);
/*����ӽ�����Ϊ15,��СΪ1*/
if (procnum > 30) procnum = 30;
if (procnum < 2) procnum = 2;
if (argc == 1) procnum = 3;
signal(SIGHUP, SIG_IGN);
signal(SIGINT, SIG_IGN);
signal(SIGTERM, onquitparent);
/*�Դ�������ʽȡ�ù����ڴ�*/
gd_shmid = comMkShm(MOB_SHMID, MOB_SHMSIZE*sizeof(int), 1, &p);
if (gd_shmid < 0)
{
sprintf(gd_erline, "comMkShm in com2MobServer, errno[%d]\n", errno);
printf(gd_erline, "comMkShm in com2MobServer, errno[%d]\n", errno);
fvwf(TodayLog,gd_erline);
exit(1);
}
gd_pregprocarr = (int *)p;
/*�Դ�������ʽȡ���ź���*/
gd_semid = comMkSem(MOB_SEMID, 1);
if (gd_semid < 0)
{
sprintf(gd_erline, "comMkSem in com2MobServer, errno[%d]\n", errno);
printf(gd_erline, "comMkSem in com2MobServer, errno[%d]\n", errno);
fvwf(TodayLog, gd_erline);
exit(1);
}
/*�ý���Ϊ��Ϣ���еķ���˽���,�Դ�������ʽ����Ϣ����*/
ret = InitMsg(MSQID_IN, MSQID_OUT, &msqid_in, &msqid_out, 1);
if (ret < 0)
{
sprintf(gd_erline, "��Ϣ����16051,16052��ʧ��, errno[%d]\n", errno);
printf(gd_erline, "��Ϣ����16051,16052��ʧ��, errno[%d]\n", errno);
fvwf(TodayLog, gd_erline);
exit(1);
}
gd_msqid_in = msqid_in;
gd_msqid_out = msqid_out;
gd_procnum = procnum;
for (i=0; itm_year+1900);
sprintf(ascday+4,"%02d",tm1->tm_mon+1);
sprintf(ascday+6,"%02d",tm1->tm_mday);
sprintf(asctm,"%02d",tm1->tm_hour);
sprintf(asctm+2,"%02d",tm1->tm_min);
sprintf(asctm+4,"%02d",tm1->tm_sec);
return 0;
}
/*getMsgTypes--����Ϣ�����и���Ϣ������ȡ��
Argument:
msqid--��Ϣ����������, input
msqnum--��Ϣ��������Ϣ��, output
msqarr--��Ϣ��������, output
*/
int getMsgTypes(msqid, msqnum, msqarr)
int msqid;
int *msqnum;
int *msqarr;
{
int ret, i;
struct msqid_ds buf;
struct msg *pos;
ret = msgctl(msqid, IPC_STAT, &buf);
if (ret < 0) return ret;
/*ȡ����Ϣ��*/
*msqnum = buf.msg_qnum;
if (*msqnum == 0) return 0;
pos = buf.msg_first;
for (i=0; i<*msqnum; i++)
{
msqarr[i] = pos->msg_type;
pos = pos->msg_next;
}
return 0;
}
/*testMsgQFull--�����Ϣ�����Ƿ����
return 0--��ӵ��
1--�Ƚ�ӵ��
-1-ϵͳ����
Argument:
msgid--��Ϣ����������
percent--
*/
int testMsgQFull(msgid, percent)
int msgid;
int percent;
{
struct msqid_ds buf;
int ret;
long cbytes, mcbytes;
ret = msgctl(msgid,IPC_STAT,&buf);
if (ret == 0)
{
cbytes = buf.msg_cbytes;
mcbytes = buf.msg_qbytes;
if ((cbytes*100/mcbytes) >= percent)
{
ret = 1;
}
else
ret = 0;
}
else
ret = -1;
return ret;
}
int RmMsg(msqid)
int msqid;
{
struct msqid_ds buf;
return msgctl(msqid, IPC_RMID, &buf);
}
/*comSleepһ������ʽ˯��,�ɱ���ʱ�ź��ж�
stime--˯��ʱ��(��λ:����)
*/
int comSleep(stime)
long stime;
{
struct timeval tv;
int tmp;
if (stime <= 0)
return 0;
tmp = stime%1000;
tv.tv_sec = stime / 1000;
tv.tv_usec = tmp*1000;
tmp = select(1,NULL,NULL,NULL,&tv);
if (tmp < 0) return -1;
return 0;
}
/*int fvwf(char *args, ...)*/
int fvwf(fn, format)
char *fn;
char *format;
{
va_list ptr;
char *arr[128];
int argno = 0;
FILE *fp;
fp = fopen(fn, "a");
fprintf(fp, "%s", format);
fclose(fp);
return 0;
}
/*InitMsg--��ʼ����Ϣ����
�������Ϣ���ж�������ڷ��������˵��
Argument:
inkey--����Ϣ���м�ֵ
outkey--����Ϣ���м�ֵ
msqid_in--����Ϣ����������
msqid_out--����Ϣ����������
flag--�Ƿ��Դ����ķ�ʽ 0-�� 1-��
*/
int InitMsg(inkey, outkey, msqid_in, msqid_out, flag)
int inkey;
int outkey;
int *msqid_in;
int *msqid_out;
int flag;
{
if (flag == 1)
{
*msqid_out = msgget(outkey, 0666|IPC_CREAT);
if (*msqid_out < 0) return -1;
*msqid_in = msgget(inkey, 0666|IPC_CREAT);
if (*msqid_in < 0) return -1;
}
else
{
*msqid_out = msgget(outkey, 0666);
if (*msqid_out < 0) return -1;
*msqid_in = msgget(inkey, 0666);
if (*msqid_in < 0) return -1;
}
gd_msqid_log = msgget(MSQID_LOG, 0666);
if (gd_msqid_log < 0) return -1;
return 0;
}
/*comMsgSend--ͨ����Ϣ���з��ͺ���
Argument:
msqid--��Ϣ����������
buf--���������ݽṹ
*/
int comMsgSend(msqid, buf)
int msqid;
comMsgBuf_t *buf;
{
int ret, i=0;
ret = msgsnd(msqid, buf, sizeof(comMsgBuf_t), MSG_NOERROR);
return ret;
}
int logMsgSend(msqid, buf)
int msqid;
logMsgBuf_t *buf;
{
int ret, i=0;
while (testMsgQFull(msqid, 60) != 0)
{
ret = comSleep(100);
i ++;
if (ret < 0) break;
/*50���ڻ�δ����Ϣ�ͳ�*/
if (i == 500) { ret = -1; break; }
}
if (ret < 0) return ret;
ret = msgsnd(msqid, buf, sizeof(logMsgBuf_t), MSG_NOERROR);
return ret;
}
/*clientMsgRecv--�ͻ��˽��̴���Ϣ���н�������
Argument:
msqid--��Ϣ����������
uniqueid--��Ϣ��Ψһ��ʶ(���׵�Ψһ��ʶ)
buf--���յ�������
*/
int clientMsgRecv(msqid, uniqueid, buf)
int msqid;
char *uniqueid;
comMsgBuf_t *buf;
{
int ret;
for (;;)
{
ret = msgrcv(msqid, buf, sizeof(comMsgBuf_t), getpid(), MSG_NOERROR);
if (ret < 0) return ret;
/*ֻ�н��յ�uniqueid��ʶ����Ϣ�����ɹ�����*/
if (memcmp(buf->uniqueid, uniqueid, strlen(uniqueid)) == 0) break;
}
return 0;
}
/*comMkSem-ͨ��ȡ���ź���
return--���������
Argument:
id--�����ڴ��ֵ
creat--�Ƿ��Դ�������ʽ(0-no 1-yes)
*/
int comMkSem(id, creat)
int id;
int creat;
{
int semid, st = 0;
if (creat == 0)
semid = semget((key_t)id, 1, 0666);
else
semid = semget((key_t)id, 1, 0666 | IPC_EXCL | IPC_CREAT);
if ( semid < 0 )
{
if ( errno == EEXIST )
semid = semget((key_t)id, 1, 0);
}
else
st = semctl(semid, 0, SETVAL, 1);
if ( semid < 0 || st < 0 ) return( -1 );
return( semid );
}
/*ɾ���ź���*/
int RmSem(semid)
int semid;
{
return( semctl(semid, IPC_RMID, 0) ) ;
}
/*�����������*/
int SemPlus(sid)
int sid;
{
int ret;
ret = SemCall(sid, -1);
return ret;
}
/*�����������*/
int SemSub(sid)
int sid;
{
int ret;
ret = SemCall(sid, 1);
return ret;
}
/*�������*/
int SemCall(sid, op)
int sid;
int op;
{
int ret;
struct sembuf sbuf;
sbuf.sem_num = 0;
sbuf.sem_op = op;
sbuf.sem_flg = 0;
ret = semop(sid, &sbuf, 1);
return ret;
}
/*comMkShm--ȡ�ù����ڴ�
return >0-�����ڴ�������
<=0--Fail
Argument:
shmkey--�����ڴ��ֵ,input
size--�����ڴ��С,input
creat--�Ƿ��Դ�������ʽȡ�ù����ڴ�(0:no 1:yes)
pshm--�����ڴ��ַ,output
*/
int comMkShm(shmkey, size, creat, pshm)
int shmkey;
int size;
int creat;
void **pshm;
{
int shmid;
if (creat == 1)
{
/*SHM_RND--��ֻ����ʽ*/
if((shmid = shmget(shmkey, 0, SHM_RND)) > 0)
{
printf("WARNING:shm %ld already exist,killed !\n",shmkey);
shmctl(shmid,IPC_RMID,0);
}
shmid = shmget(shmkey, size, IPC_CREAT|0666);
if ((shmid) <= 0) return shmid;
}
else
{
shmid = shmget(shmkey, size, 0666);
if ((shmid) <= 0) return shmid;
}
*pshm = shmat(shmid, 0, 0);
/*�������ڴ����*/
memset(*pshm, 0, size);
return shmid;
}
int RmShm(shmid)
int shmid;
{
return shmctl(shmid,IPC_RMID,0);
}
int DtShm(shmaddr)
char *shmaddr;
{
return shmdt(shmaddr);
}
/*onquitparent--�������˳�ʱ����������*/
void onquitparent(sig)
int sig;
{
int i, cnt, retstatus, pid, ret;
/*���ӽ��̷����Զ����ź�*/
for (i=0; i 0) kill(gd_pidarr[i], SIGTERM);
}
cnt = 0;
for (;;)
{
/*�ȴ��ӽ��̽���*/
retstatus = 0;
pid = wait(&retstatus);
retstatus >>= 8;
printf("wait pid[%d] status[%d]\n", pid, retstatus);
if (pid <= 0) continue;
if (pid > 0) cnt ++;
if (cnt == gd_procnum) break;
}
/*����IPC��Դ*/
RmMsg(gd_msqid_in);
RmMsg(gd_msqid_out);
RmShm(gd_shmid);
RmSem(gd_semid);
exit(0);
}
int monitorchild(procnum, msqid_in, msqid_out)
int procnum;
int msqid_in;
int msqid_out;
{
int pid, pid1, cnt, retstatus, dim, ret1;
char sd[16], st[16];
dtime(st, sd);
sprintf(TodayLog, "%s.%s", SERVERLOG, sd+4);
cnt = 0;
for (;;)
{
retstatus = 0;
pid = wait(&retstatus);
retstatus >>= 8;
printf("wait pid[%d] status[%d]\n", pid, retstatus);
if (pid <= 0) continue;
/*�ڽ��̺��������ҳ�pid�ǵڼ�������*/
dim = findpiddied(procnum, pid);
if (dim < 0) exit(1);
pid1 = fork();
if (pid1 < 0)
exit(1);
else if (pid1 == 0)
{
/*gd_pidarr���������һ��Ԫ��monitormsg�ӽ��̽��̺�*/
if (procnum > dim)
{
printf("�ӽ���%d������...\n", getpid());
ret1 = intochild(msqid_in, msqid_out);
exit(ret1);
}
else
{
printf("�ӽ���%d������...\n", getpid());
ret1 = monitormsg(msqid_out);
exit(ret1);
}
}
gd_pidarr[dim-1] = pid1;
}
return 0;
}
/*monitormsg--���ӿ�����Ϣ����*/
int monitormsg(msqid_out)
int msqid_out;
{
int ret, i;
int msgnum; /*��Ϣ������*/
int msqarr[512]; /*��Ϣ����������*/
char dustbin[2048]; /*������Ϣ������*/
char logfile[128];
char senv[128];
gd_onquitchild_flg = 0;
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, onquitchild);
signal(SIGINT, SIG_IGN);
strcpy(senv, getenv("TONGLOGDIR"));
for (;;)
{
if (gd_onquitchild_flg == 1) break;
/*���޷���ȡ��Ϣ��������,�ʼ����Ϣ���й��ܷ���*/
sleep(600);
system("rm 0* 1* 2* 3* 4* 5* 6* 7* 8* 9*");
sprintf(logfile, "%s/TongLINK.log", senv);
unlink(logfile);
sprintf(logfile, "%s/TongLINK.err", senv);
unlink(logfile);
sprintf(logfile, "%s/acktxfile", senv);
unlink(logfile);
sprintf(logfile, "%s/pktlog", senv);
unlink(logfile);
sprintf(logfile, "%s/syslog", senv);
unlink(logfile);
sprintf(logfile, "%s/tetstlog", senv);
unlink(logfile);
sprintf(logfile, "%s/txlog", senv);
unlink(logfile);
sprintf(logfile, "%s/stxfile", senv);
unlink(logfile);
continue;
/*ÿ��60������Ϣ�������Ƿ���������Ϣ*/
sleep(60);
if (gd_onquitchild_flg == 1) break;
memset(msqarr, 0, sizeof(msqarr));
/*����Ϣ������ȡ����Ϣ��������Ϣ������(msgnum),����Ϣ����������(msqarr)*/
ret = getMsgTypes(msqid_out, &msgnum, msqarr);
if (ret < 0) return ret;
/*��msqarr������������Ϣ������Ϊ-1*/
chkmsqarrInshm(msgnum, msqarr);
for (i=0; i 0)
{
ret = msgrcv(msqid_out, dustbin, sizeof(dustbin), msqarr[i], IPC_NOWAIT);
}
}
}
return 0;
}
/*chkmsqarrInshm--�����Ϣ����,�Ƿ����ڻ����
Argument:
msgnum--��Ϣ����������һ���ж�����Ч����Ϣ
msqarr--��Ϣ��������
*/
int chkmsqarrInshm(msgnum, msqarr)
int msgnum;
int *msqarr;
{
int i, j, cnt, ret;
for (i=0; i= 0) break;
}
return TID;
}
/*intochild--�����ӽ��̴���*/
int intochild(msqid_in, msqid_out)
int msqid_in;
int msqid_out;
{
int ret, pid, tpid, i;
comMsgBuf_t sendbuf, revbuf;
logMsgBuf_t logbuf;
char mobbuf[2048], file[128], echo[16], strAPIselfbank[128];
TEPKTINFO pInfo, cInfo;
int TID ;
int ackflag;
char sd[16], st[16];
char cmdstr[512];
dtime(st, sd);
sprintf(TodayLog, "%s.%s", SERVERLOG, sd+4);
gd_onquitchild_flg = 0;
signal(SIGHUP, SIG_IGN);
signal(SIGTERM, onquitchild);
signal(SIGALRM, onchildtimeout);
alarm(0);
memset(&pInfo, 0, sizeof(TEPKTINFO));
/*Ӧ����TongEasy����ע��*/
ret = TEAppLogin(CLNT_TYPE);
if (ret < 0)
{
comSleep(50);
sprintf(gd_erline, "TEAppLogin fail errno[%d] ret[%d]\n", errno, ret);
fvwf(TodayLog, gd_erline);
exit(9);
}
/*�ر��ļ�*/
close(0);close(2);
errno = 0;
umask(0);
memset(&revbuf, 0, sizeof(comMsgBuf_t));
/*������̽����������͵���Ϣ*/
ret = msgrcv(msqid_in, &revbuf, sizeof(comMsgBuf_t), 0, MSG_NOERROR);
sprintf(gd_erline, "com2MobServerrev ret[%d] pid[%d] txcode[%s] buf[%s] errno[%d]\n", ret, revbuf.pid, revbuf.txcode, revbuf.buf, errno);
fvwf(TodayLog, gd_erline);
if (gd_onquitchild_flg == 1) return(0);
if (ret < 0)
{
sprintf(gd_erline, "com2MobServer msgrcv fail errno[%d]\n", errno);
fvwf(TodayLog, gd_erline);
return(1);
}
/*��ʼΪ����ʱ*/
gd_timeoutchild_flg = 0;
if (memcmp(revbuf.txcode, "600000", 6) == 0)
{
/*��300����Ҫ���յ��ƶ��Ļ�Ӧ*/
alarm(300);
}
else
{
/*��50����Ҫ���յ��ƶ��Ļ�Ӧ*/
alarm(50);
}
/*����һ���µĽ���*/
TID = TETxStart();
if ( TID < 0 )
{
sprintf(gd_erline, "TETxStart Fail[%d]\n", TID);
fvwf(TodayLog, gd_erline);
memcpy(&sendbuf, &revbuf, sizeof(comMsgBuf_t));
strcpy(sendbuf.buf, "Err-EINT");
alarm(0);
ret = comMsgSend(msqid_out, &sendbuf);
TEAppLogout();
return(1);
}
/*��дpInfo*/
strcpy(strAPIselfbank, APIselfbank);
strtok(strAPIselfbank, " ");
pInfo.Ver = 'Z';
strcpy(pInfo.Src, strAPIselfbank);
strcpy(pInfo.Snd, strAPIselfbank);
strcpy(pInfo.Rcv, "400000001");
pInfo.TID = TID;
strcpy(pInfo.OptCode, revbuf.txcode);
memset(file, 0, sizeof(file));
/*���պ˶� 600000*/
if (memcmp(revbuf.txcode, "600000", 6) == 0)
{
pInfo.DataLen = strlen(revbuf.buf) - 16;
/*��Ϣ���н��ջ�����ǰ4Ϊ��������,����12λΪ���,���16λ���ļ���*/
memcpy(mobbuf, revbuf.buf, 16);
mobbuf[16] = 0;
file[0] = '+';
memcpy(file+1, revbuf.buf+16, 16);
file[16+1] = 0;
sprintf(gd_erline, "mobbuf[%s] file[%s]\n", mobbuf, file);
fvwf(TodayLog, gd_erline);
pInfo.FileLen = strlen(file);
}
else
{
strcpy(mobbuf, revbuf.buf);
pInfo.FileLen = 0;
}
pInfo.DataLen = strlen(mobbuf);
/*TongEasy�����˷�������ȴ�Ӧ��*/
ret = TECallSvr(&pInfo,mobbuf,file);
mobbuf[1260+5] = 0;
sprintf(gd_erline, "com2MobServer TECallSvr ret[%d] pid[%d] txcode[%s] mobbuf[%s]\n", ret, revbuf.pid, revbuf.txcode, mobbuf);
fvwf(TodayLog, gd_erline);
/*����ʱ���ر�*/
alarm(0);
if (gd_timeoutchild_flg == 1)
{
/*֪ͨ���񷽿ͻ��˽���ʧ��*/
TETxEnd(&pInfo,1);
memcpy(&sendbuf, &revbuf, sizeof(comMsgBuf_t));
strcpy(sendbuf.buf, "Err-EINT");
ret = comMsgSend(msqid_out, &sendbuf);
TEAppLogout();
return 1;
}
if (ret <= 0)
{
/*֪ͨ���񷽿ͻ��˽���ʧ��*/
TETxEnd(&pInfo,1);
memcpy(&sendbuf, &revbuf, sizeof(comMsgBuf_t));
strcpy(sendbuf.buf, "Err-EINT");
ret = comMsgSend(msqid_out, &sendbuf);
TEAppLogout();
return 1;
}
/*��������Ϣ���нṹ��ֵ*/
memcpy(&sendbuf, &revbuf, sizeof(comMsgBuf_t));
strcpy(sendbuf.buf, mobbuf);
memcpy(&cInfo, &pInfo, sizeof(TEPKTINFO));
if (atoi(pInfo.EchoCode) != 0) /*˵��Tong����ʧ��*/
{
/*TongEasy�����˷��ͳ���*/
TETxEnd(&cInfo, 1);
sprintf(gd_erline, "pInfo.EchoCode[%s]\n", pInfo.EchoCode);
fvwf(TodayLog, gd_erline);
strcpy(sendbuf.buf, "Err-FAIL");
}
else
{
/*TongEasy�����˷���ȷ��*/
TETxEnd(&cInfo, 0);
}
ret = comMsgSend(msqid_out, &sendbuf);
if (ret < 0)
{
sprintf(gd_erline, "com2MobServer comMsgSend fail errno[%d]\n", errno);
fvwf(TodayLog, gd_erline);
}
if (memcmp(sendbuf.buf, "Err", 3) != 0)
{
if ((strcmp(sendbuf.txcode, "200000") == 0) || (strcmp(sendbuf.txcode, "500000") == 0))
{
logbuf.pid = sendbuf.pid;
strcpy(logbuf.uniqueid, sendbuf.uniqueid);
strcpy(logbuf.txcode, sendbuf.txcode);
strcpy(logbuf.sndbuf, sendbuf.buf);
revbuf.buf[510] = 0;
strcpy(logbuf.revbuf, revbuf.buf);
ret = logMsgSend(gd_msqid_log, &logbuf);
}
}
TEAppLogout();
return 0;
}