#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;
}