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

📄 simdrv.c

📁 仿真测试接口程序。根据电总《用户接入网管理功能与管理接口技术规范》之《与112集中受理系统接口规范》
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <stdlib.h>#include <poll.h>#include <termio.h>#include <fcntl.h>#include <sys/stat.h>#include <unistd.h>#include <setjmp.h>#include <signal.h>#include <sys/types.h>#include <sys/wait.h>#include <string.h>#include <stdarg.h>#include  <time.h>#include  <errno.h>#include "simdrv.h"#include "simu112.h"#define MaxIdleSeconds 3600TESTREQMSG testReqMsg;TESTMSG testMsg;jmp_buf env;int logfp;struct ChildPidNode{	int pid;	struct ChildPidNode *Next;};typedef struct ChildPidNode CHILDPIDNODE;CHILDPIDNODE *PidList;time_t IdleStart;void timeout(int sig);/* extern int s1240_conn_switch(); */extern int s1240_proc();extern int s1240_conn_switch(int port_fd);extern int result_analy();extern int sp30_proc();extern int sp30_conn_switch(int port_fd);extern int dms10_proc();extern int neax_proc();extern int neax_conn_switch(int port_fd);extern int neax_rsu_proc();extern int neax_rsu_conn_switch(int port_fd);extern int att_5ess_proc();extern int att_5ess_conn_switch(int port_fd);extern int cc08_proc();extern int cc08_conn_switch(int port_fd, char *phone_number, TESTMSG * testmsg);extern int dms100_proc();extern int dms100_conn_switch(int port_fd);extern int anet_proc();extern int anet_q3_proc();extern int ewsd_proc();extern int ewsd_conn_switch(int port_fd, char *dial_number);extern int f150_proc();extern int f150_conn_switch(int port_fd);static void sig_child_died(int sig);void writelog(int logfp, char *fmt,...);void check_log();void return_msg();int conn_switch(int sock, int SwitchType, char *telephone, char *password);void f_set_result(TESTMSG * testMsg);void DeletePidNode(CHILDPIDNODE * prevnode, CHILDPIDNODE * node);void AddPidNode(int pid);void CheckChildDied();int f_simdrv_receive(int sock, char *szBuffer, int *len, int max_len, int wait_time);int CheckIdle();int ChildDiedFlag = 0;main(){	int i, rc;	int sock, cmdret, ret;	int pid;	struct sigaction action;	/* open log file */	if ((logfp = open(LOGFILE, O_WRONLY | O_CREAT | O_APPEND, 0644)) < 0)	{		exit(1);	}	writelog(logfp, "SIMDRV startting ...");	action.sa_flags = 0;	action.sa_handler = sig_child_died;	sigaction(SIGCHLD, &action, NULL);	PidList = NULL;	IdleStart = time(NULL);	for (;;)	{		check_log();		if (ChildDiedFlag)		{			CheckChildDied();		}		/* if simdrv is idle too long then we exit */		if (CheckIdle() == 1)			exit(0);		/* receive from SIMSRV */		ret = f_simdrv_receive(0, (char *) (&testReqMsg), &rc, TESTREQSIZE, 120000);		if (ret < 0)		{			writelog(logfp, "Socket was disconnected! SIMDRV exit! ret=%d", ret);			exit(0);		}		if (rc == 0)			continue;		/* initialize TESTMSG */		memset(&testMsg, 0, TESTMSGSIZE);		testMsg.CommandType = testReqMsg.CommandType;		strcpy(testMsg.CorrelationTag, testReqMsg.CorrelationTag);		testMsg.EndFlag = ';';		/* check msg from SIMSRV */		if (strstr((char *) (&testReqMsg),"version;")!=NULL || strstr((char *) (&testReqMsg),"VERSION;")!=NULL)		{			char ver_str[20];			sprintf(ver_str,"simdrv version: %s;",LIC_VERSION);			write(1, ver_str, strlen(ver_str));			writelog(logfp, "request version: %s",LIC_VERSION);			continue;		}				if (rc != TESTREQSIZE || *((char *) (&testReqMsg) + (rc - 1)) != ';')		{			strcpy(testMsg.Error, INSERR);			return_msg(&testMsg);			writelog(logfp, "ReqMsg error,rc=%d,TESTREQSIZE=%d,EndFlag=%c", rc, TESTREQSIZE, *((char *) (&testReqMsg) + (rc - 1)));			continue;		}				/* Set IdleStart */		IdleStart = time(NULL);		writelog(logfp, "exec command begin : CommandType=%d\n\				SwitchType=%d\n\				CorrelationTag=%s\n\				TSN=%s\n\				PortPassword=%s\n\				TestPortType=%c\n\				DialNumber=%s\n\				TSAddress=%s\n\				TSPortNo=%s\n\				TeleNumber=%s\n\				ExkNumber=%s\n\				Grade=%s\n\				EndFlag=%c\n",						 testReqMsg.CommandType, testReqMsg.SwitchType,						 testReqMsg.CorrelationTag,						 testReqMsg.TSN,						 testReqMsg.PortPassword,						 testReqMsg.TestPortType, testReqMsg.DialNumber,						 testReqMsg.TSAddress, testReqMsg.TSPortNo,						 testReqMsg.TeleNumber, testReqMsg.ExkNumber,						 testReqMsg.Grade,						 testReqMsg.EndFlag);		if ((pid = fork()) == 0)		{			if (testReqMsg.SwitchType==DEMO)			{				switch (testReqMsg.CommandType)				{				case TST_FULL:				case TST_LOOP:				case MEAS_VG_DC:				case MEAS_VG_AC:				case MEAS_LOOP_CUREST:				case MEAS_LOOP_RES:				case MEAS_RES:				case MEAS_CAPNC:				case MEAS_IMPED:					f_set_result(&testMsg);					strcpy(testMsg.TestResult.SwitchName, "DEMO");					break;				default:					strcpy(testMsg.Error, INSERR);					break;				}				return_msg(&testMsg);				exit(0);			}			switch (testReqMsg.CommandType)			{			case TST_FULL:			case TST_LOOP:			case MEAS_VG_DC:			case MEAS_VG_AC:			case MEAS_LOOP_CUREST:			case MEAS_LOOP_RES:			case MEAS_RES:			case MEAS_CAPNC:			case MEAS_IMPED:			case MEAS_NSE:			case CONN_TSTSIG_SOUNDER:			case MEAS_TN:			case MEAS_FEEDVOL:			case MEAS_LOOPRING:			case MEAS_OUTPLSE:			case MEAS_ISDN:			case TST_RINGSGNL:			case CONN_MONEST:			case DISC_MON:			case CONN_MONBRDGD:			case CONN_FMONBRDGD:				/* connect to Terminal Server, connect twice, every time no more than 10 seconds */				signal(SIGALRM, timeout);				sock = -1;				if (setjmp(env) == 0)				{					alarm(10);					sock = conntcp(testReqMsg.TSAddress, testReqMsg.TSPortNo);					alarm(0);				}				if (sock < 0)				{					poll(0, 0, 600);			/* if fail, we wait a moment, and then connect again */					signal(SIGALRM, timeout);					sock = -1;					if (setjmp(env) == 0)					{						alarm(10);						sock = conntcp(testReqMsg.TSAddress, testReqMsg.TSPortNo);						alarm(0);					}					if (sock < 0)					{						writelog(logfp, "Terminal server not alive, TSAddress1:");						writelog(logfp, testReqMsg.TSPortNo);						strcpy(testMsg.Error, LINEERROR);						break;					}				}				writelog(logfp, "conntcp right!");				/* if modem connection, connect modem */				if (testReqMsg.TestPortType == 'D')				{					if (connect_modem(sock, testReqMsg.DialNumber) < 0)					{						writelog(logfp, "Modem Error!");						strcpy(testMsg.Error, LINEERROR);						break;					}					writelog(logfp, "Modem right!");				}				/* auto command to exchange and analysis command result */				switch (testReqMsg.SwitchType)				{				case S1240E:					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = s1240_proc(sock, &testReqMsg, &testMsg, S1240E);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "S1240E");					break;				case S1240J:					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = s1240_proc(sock, &testReqMsg, &testMsg, S1240J);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "S1240J");					break;				case SP30:				case SP30CN:					/*					   f_set_result(&testMsg);					   cmdret=0;					 */					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = sp30_proc(sock, testReqMsg.SwitchType, testReqMsg.TeleNumber, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					/*rc=write(sock,"+++ATH\r\n+++ATH\r\n+++ATH\r\n+++ATH\r\n",32); */					if (testReqMsg.SwitchType == SP30)						strcpy(testMsg.TestResult.SwitchName, "SP30");					else						strcpy(testMsg.TestResult.SwitchName, "SP30CN");					break;				case DMS10:					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = dms10_proc(sock, testReqMsg.ExkNumber, testReqMsg.TeleNumber, testReqMsg.PortPassword, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					/*rc=write(sock,"+++ATH\r\n+++ATH\r\n+++ATH\r\n+++ATH\r\n",32); */					strcpy(testMsg.TestResult.SwitchName, "DMS10");					break;				case NEAX61:					/*					   f_set_result(&testMsg);					   cmdret=0;					 */					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(90);						cmdret = neax_proc(sock, testReqMsg.TeleNumber, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "NEAX61");					break;				case NEAX_RSU:					/*					   f_set_result(&testMsg);					   cmdret=0;					 */					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(100);						cmdret = neax_rsu_proc(sock, testReqMsg.TeleNumber, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "NEAX_RSU");					break;				case S5ESS:					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = att_5ess_proc(sock, testReqMsg.TeleNumber, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "5ESS");					break;				case CC08:					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = cc08_proc(sock, testReqMsg.TeleNumber, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "CC08");					break;				case HW_AN:						/* 华为接入网 */					writelog(logfp, "HW_AN TYPE");					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "HW_AN");					break;				case ZX_AN:						/* 中兴接入网 */					writelog(logfp, "ZX_AN TYPE");					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "ZX_AN");					break;				case UT_AN:						/* UTStarcom 接入网 */					writelog(logfp, "UT_AN TYPE");					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "UT_AN");					break;				case BE_AN:						/* 上海贝尔接入网 */					writelog(logfp, "BE_AN TYPE");					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "BE_AN");					break;				case XMZ_AN:						/* 西门子接入网 */					writelog(logfp, "XMZ_AN TYPE");					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "XMZ_AN");					break;				case DMS100:					/*					   f_set_result(&testMsg);					   cmdret=0;					 */					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(90);						cmdret = dms100_proc(sock, testReqMsg.TeleNumber, testReqMsg.SwitchUserName, testReqMsg.PortPassword, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "DMS100");					break;				case EWSD:					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(90);						cmdret = ewsd_proc(sock, testReqMsg.TeleNumber, testReqMsg.PortPassword, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "EWSD");					break;				case F150:					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(90);						cmdret = f150_proc(sock, testReqMsg.TeleNumber, testReqMsg.PortPassword, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "F150");					break;				case FST_AN:						/* 富士通接入网 */					writelog(logfp, "FST_AN TYPE");					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "FST_AN");					break;				case LX_AN:						/* 朗讯接入网 */					writelog(logfp, "LX_AN TYPE");					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "LX_AN");					break;				case NEC_AN:						/* NEC 接入网 */					writelog(logfp, "NEC_AN TYPE");					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = anet_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "NEC_AN");					break;				case Q3_AN:						/* 接入网Q3接口 */					writelog(logfp, "Q3_AN TYPE");					signal(SIGALRM, timeout);					if (setjmp(env) == 0)					{						alarm(120);						cmdret = anet_q3_proc(sock, testReqMsg.CommandType, testReqMsg.TeleNumber, testReqMsg.V5EN, testReqMsg.OffHook, testReqMsg.Num, testReqMsg.Loop, testReqMsg.Channel, testReqMsg.UseGrade, testReqMsg.Grade, testReqMsg.TSN, &testMsg);						alarm(0);					}					else						cmdret = AM_TIME_OUT;					strcpy(testMsg.TestResult.SwitchName, "Q3_AN");					break;				case AXE10:				default:					writelog(logfp, "UNKNOWN EXCHANGE TYPE");					strcpy(testMsg.Error, NOFOUND);					break;				}												/* end of switch (testReqMsg.SwitchType) */				switch (cmdret)				{				case AM_NO_RESPONSE:					writelog(logfp, "AM_NO_RESPONSE");					strcpy(testMsg.Error, DISCONN);					break;				case AM_TIME_OUT:					writelog(logfp, "AM_TIME_OUT");					strcpy(testMsg.Error, DISCONN);					break;				case AM_INVALID_PASSWORD:					writelog(logfp, "AM_INVALID_PASSWORD");					strcpy(testMsg.Error, DISCONN);					break;				case AM_PORT_DOWN:					writelog(logfp, "AM_PORT_DOWN");					strcpy(testMsg.Error, LINEERROR);					break;				case AM_INVALID_PORTFD:					writelog(logfp, "AM_INVALID_PORTFD");					strcpy(testMsg.Error, LINEERROR);					break;

⌨️ 快捷键说明

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