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

📄 simuresp.c

📁 仿真测试接口程序。根据电总《用户接入网管理功能与管理接口技术规范》之《与112集中受理系统接口规范》
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <time.h>#include <string.h>#include "simu112.h"#include "simuintp.h"#ifdef WIN32_ENV#include <WINSOCK.H>#else#include <unistd.h>#endifstatic int driverResponse2(int fd, void *buffer, int cnt);extern SOCKETSTRUCT so[MAX_FD];extern int get_vercode_from_result(char *result, char *vername);/* This function added to handle more than one command in same buffer */int driverResponse(int fd, void *buffer, int cnt){	int c;	if (buffer == NULL)	{		c = driverResponse2(fd, buffer, cnt);		return c;	}	for (;;)	{		c = driverResponse2(fd, buffer, cnt);		if (c == 0)			break;		if (c == cnt)			break;		cnt = c;	}	return c;}static int driverResponse2(int fd, void *buffer, int cnt){	int count, i;	time_t tt;	struct tm *ptm;	char *tmp_ptr;	int ver_code;	CLIENT_STATUS *cs_ptr;	DRIVER_STATUS *drv_ptr;	TESTMSG test_msg;	int sd;	char buf[16];	char vercode_str[30];	char vername[10];	if (buffer == NULL)	{															/* EOF on driver port */		so_close(fd);								/* so_close driver socket */		return (0);	}	/*if ((tmp_ptr = strchr(buffer, ';')) == NULL)	   return (cnt);                entire command not yet received */	tmp_ptr = (char *) buffer;	i = 0;	while (*tmp_ptr != ';')	{		tmp_ptr++;		i++;		if (i >= so[fd].readOffset)			return (cnt);	}	count = tmp_ptr - (char *) buffer + 1;	/* length of response */	/* copy command into cmd buffer so we can play with it */	memset((void *) &test_msg, 0, sizeof(TESTMSG));	/*  test for command too long */	/* note we fall thru with partial command which should error */	if (count > (sizeof(TESTMSG)))	{		i = sizeof(TESTMSG);	}	else	{		i = count;	}	memcpy((void *) &test_msg, buffer, i);	/* move any remaining chars in buffer to beginning, adjust count */	i = 0;	if (cnt > count)	{		for (; i < (cnt - count); i++)			*((char *) buffer + i) = *((char *) buffer + i + count);	}	memset(((char *) buffer + i), 0, count);	/* zero remainder of buffer */	cnt -= count;	if (cnt < 0)		cnt = 0;	/*determine which ts_port the result come from */	for (drv_ptr = so[fd].driverStatus; drv_ptr; drv_ptr = drv_ptr->next)	{		if (strcmp(drv_ptr->ctag, test_msg.CorrelationTag) == 0)			break;	}	if (!drv_ptr)	{		/*abort response */		/*printf("drv_ptr NULL!,abort response!\n"); */	}	else	{		sd = drv_ptr->client_fd;/*    if(sd==-1){   return cnt;   } */		/*find client status */		for (cs_ptr = so[sd].clientStatus; cs_ptr; cs_ptr = cs_ptr->next)		{			if (strcmp(cs_ptr->test_req_msg.CorrelationTag, test_msg.CorrelationTag) == 0)				break;		}		if (!cs_ptr)		{			/*abort response */			/*printf("cs_ptr NULL!,abort response!\n"); */		}		else		{			switch (test_msg.CommandType)			{			case TST_QUERY:				/*process the result of this special command */				if (strncmp(test_msg.TestResult.TestConclusion, "ok", 2) == 0)				{					time(&tt);					ptm = localtime(&tt);					sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response),									" %04d-%02d-%02d %02d:%02d:%02d\r\nM  %s COMPLD\r\n   \"V=0,\"\r\n;",									ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday,									ptm->tm_hour, ptm->tm_min, ptm->tm_sec,									test_msg.CorrelationTag);				}				else				{					buf[0] = 'S';					strncpy(&buf[1], test_msg.TestResult.TestConclusion, 3);					buf[4] = '\0';					for (i = 0; i < NUMBER_ERROR_CODES; i++)					{						if (strcmp(buf, ErrorCodeDefinitions[i]) == 0)							break;					}					if (i < NUMBER_ERROR_CODES)						deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, SERR(i));					else					{						/*can't access the cause of line error */						deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, S305);					}				}				so_write(sd, cs_ptr->TL1response, strlen(cs_ptr->TL1response));				break;			case TST_FULL:			case TST_LOOP:				if (test_msg.Error[0] != '\0')				{					buf[0] = 'S';					strncpy(&buf[1], test_msg.Error, 3);					buf[4] = '\0';					for (i = 0; i < NUMBER_ERROR_CODES; i++)					{						if (strcmp(buf, ErrorCodeDefinitions[i]) == 0)							break;					}					if (i < NUMBER_ERROR_CODES)						deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, SERR(i));					else					{						/*can't access the cause of line error */						deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, S305);					}					so_write(sd, cs_ptr->TL1response, strlen(cs_ptr->TL1response));				}				else				{					time(&tt);					ptm = localtime(&tt);					sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response),									" %04d-%02d-%02d %02d:%02d:%02d\r\nM  %s COMPLD",									ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday,									ptm->tm_hour, ptm->tm_min, ptm->tm_sec,									test_msg.CorrelationTag);					getTL1response(test_msg.TestResult, cs_ptr->TL1response);					so_write(sd, cs_ptr->TL1response, strlen(cs_ptr->TL1response));				}				break;			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:				if (test_msg.Error[0] != '\0')				{					buf[0] = 'S';					strncpy(&buf[1], test_msg.Error, 3);					buf[4] = '\0';					for (i = 0; i < NUMBER_ERROR_CODES; i++)					{						if (strcmp(buf, ErrorCodeDefinitions[i]) == 0)							break;					}					if (i < NUMBER_ERROR_CODES)						deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, SERR(i));					else					{						/*can't access the cause of line error */						deny(cs_ptr->tid, drv_ptr->ctag, cs_ptr->TL1response, S305);					}					so_write(sd, cs_ptr->TL1response, strlen(cs_ptr->TL1response));				}				else				{					time(&tt);					ptm = localtime(&tt);					vercode_str[0] = '\0';					if (test_msg.TestResult.OutResult[0] != 0)					{						ver_code = get_vercode_from_result(test_msg.TestResult.OutResult, vername);						if (ver_code != -1)							sprintf(vercode_str, "%s,\r\nORST=%s,\r\n", vername, test_msg.TestResult.OutResult);					}					switch (test_msg.CommandType)					{					case MEAS_VG_DC:						sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response),										" %04d-%02d-%02d %02d:%02d:%02d\r\nM  %s COMPLD\r\n%s TG=%s,RG=%s,RT=%8.3f\r\n%s\r\n;",										ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday,										ptm->tm_hour, ptm->tm_min, ptm->tm_sec,										test_msg.CorrelationTag,										vercode_str,										test_msg.TestResult.TG2_DCvol, test_msg.TestResult.RG2_DCvol, atof(test_msg.TestResult.TG2_DCvol) - atof(test_msg.TestResult.RG2_DCvol),										test_msg.TestResult.TestConclusion);						break;					case MEAS_VG_AC:						sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response),										" %04d-%02d-%02d %02d:%02d:%02d\r\nM  %s COMPLD\r\n%s TG=%s,RG=%s,RT=%8.3f\r\n%s\r\n;",										ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday,										ptm->tm_hour, ptm->tm_min, ptm->tm_sec,										test_msg.CorrelationTag,										vercode_str,										test_msg.TestResult.TG_ACvol, test_msg.TestResult.RG_ACvol, atof(test_msg.TestResult.TG_ACvol) - atof(test_msg.TestResult.RG_ACvol),										test_msg.TestResult.TestConclusion);						break;					case MEAS_LOOP_CUREST:						sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response),										" %04d-%02d-%02d %02d:%02d:%02d\r\nM  %s COMPLD\r\n%s lcr=%s\r\n%s\r\n;",										ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday,										ptm->tm_hour, ptm->tm_min, ptm->tm_sec,										test_msg.CorrelationTag,										vercode_str,										test_msg.TestResult.LoopCur,										test_msg.TestResult.TestConclusion);						break;					case MEAS_LOOP_RES:						sprintf(cs_ptr->TL1response + strlen(cs_ptr->TL1response),										" %04d-%02d-%02d %02d:%02d:%02d\r\nM  %s COMPLD\r\n%s lr=%s\r\n%s\r\n;",										ptm->tm_year+1900, ptm->tm_mon + 1, ptm->tm_mday,										ptm->tm_hour, ptm->tm_min, ptm->tm_sec,

⌨️ 快捷键说明

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