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

📄 cbcmain.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Include.h"

int Process_A_Message(CBEMESSAGE_t *s_CBEMessage);
int Process_B_Message(CBEMESSAGE_t *s_CBEMessage);
int Process_C_Message(CBEMESSAGE_t *LPs_CBEMessage);
int Initialize();

HANDLE hListen;
HANDLE hSendCBE;
HANDLE hReceBsc;

MESSAGE_BUF_t Rece_CBE_Buf;
MESSAGE_BUF_t Send_CBE_Buf;

/* 解邦定参数的互斥量 */
HANDLE UnpackBindmutex;

/* 运行时参数 */
RUNTIMEINFO_t s_RuntimeInfo;


/*
 * 小区路由配置信息
 * 和小区有关的路由表
 */
BSC_CELL_INFO_t    s_BSCCellInfo[MAX_BSC_CONNECT];

/* BSC的X.25连接时信息 */
BSC_CONNECT_INFO_t s_BscConnectInfo[MAX_BSC_CONNECT];

/* CBC X25的地址 */
char g_X25LocalAddr[BSC_ADDR_LEN+1];

/* CBC和BSC上下行链路的端口号和逻辑会话号 */
X25_PORT_LSN_t BscX25_Port_Lsn[MAX_BSC_CONNECT];

/* 端口号和逻辑会话号文件指针 */
FILE *f_port_lsn;

/* 逻辑进程数据区 */
unsigned char  ProcessData[LPROCESS][LPCB_DATA_SIZE];

/* 业务请求计数器,包括统计 */
COUNT_t s_CBSECount;

/* 解包缓冲区 */
CBC_BSC_UNPACK_t CBCBSC_Unpack;

/* 时区 */
int TimeZone;

int main()
{
	int          sId;
	char         presskey;
	int          iReturnValue;
	CBEMESSAGE_t s_CBEMessage;

	//邦定
	VBIND_t s_VBind;
	unsigned char BindBuf[200];
	int           len;
	//

	//-----
	char          Addr[20]="10.0.12.118";
	//------

	//X.25 Address Parameter
	char          RemoteAddr[10]="123";
	int           iPort=1;
	char          UserInfo[10]="hello";
	int           UserInfoLen=5;

    //-------------------------

	memset(&Rece_CBE_Buf,0,sizeof(MESSAGE_BUF_t));
	memset(&Send_CBE_Buf,0,sizeof(MESSAGE_BUF_t));

	Initialize();

	if ((sId=initsocket())<0)
		return FAILURE;

	//
	Rece_CBE_Buf.MsgFull  = CreateSemaphore(NULL,0,MSG_QUEUE_SIZE,NULL);
	Rece_CBE_Buf.MsgEmpty = CreateSemaphore(NULL,MSG_QUEUE_SIZE,MSG_QUEUE_SIZE,NULL);
	Rece_CBE_Buf.MsgMutex = CreateMutex(NULL,FALSE,NULL);
	Send_CBE_Buf.MsgFull  = CreateSemaphore(NULL,0,MSG_QUEUE_SIZE,NULL);
	Send_CBE_Buf.MsgEmpty = CreateSemaphore(NULL,MSG_QUEUE_SIZE,MSG_QUEUE_SIZE,NULL);
	Send_CBE_Buf.MsgMutex = CreateMutex(NULL,FALSE,NULL);


	UnpackBindmutex = CreateMutex(NULL,FALSE,NULL);

	hListen=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)ListenUser,&sId,0,NULL);
	hSendCBE=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)SendCBEMessage,NULL,0,NULL);


	if (Init25()<0)
	{
		printf("X25Init error!\n");
		return FAILURE;
	}

	memset(&s_VBind,0,sizeof(VBIND_t));
	s_VBind.p_Name.bFlag=1;
	s_VBind.p_Name.s_Operate.bFlag=1;
	s_VBind.p_Name.s_Operate.clength=7;
	strcpy(s_VBind.p_Name.s_Operate.cOperator,"eastcom");
	
	s_VBind.p_Name.s_BilateralAgreem.bFlag=0;
	s_VBind.p_Name.s_BilateralAgreem.clength=8;
	strcpy(s_VBind.p_Name.s_BilateralAgreem.cBilateralAgreem,"yangming");
	
	s_VBind.p_Name.s_DataNetWorkAddress.bFlag=1;
	s_VBind.p_Name.s_DataNetWorkAddress.clength=3;
	strcpy(s_VBind.p_Name.s_DataNetWorkAddress.cXl2lAddress,"456");

	s_VBind.p_PassWord.bFlag=0;
	s_VBind.p_PassWord.clength=3;
	strcpy(s_VBind.p_PassWord.cPassword,"555");
	
	s_VBind.p_Version.bFlag=0;
	s_VBind.p_Version.cVersion=2;


	len=Pack_cbse_VBIND(&s_VBind,BindBuf);



/*连接Bsc
	if ((X25handle=CallToRemote(RemoteAddr, LocalAddr, iPort, UserInfo, UserInfoLen, 0))<0)
	{
		printf("X25connect error!\n");
		return FAILURE;
	}
	else
	{
		printf("X25 connected!\n");
	}
*/


	for(;;)
	{
        GetCBERecvMsg(&s_CBEMessage);
		switch (s_CBEMessage.s_MessageHead.iMessageAreaId)
		{
		case A:
			iReturnValue=Process_A_Message(&s_CBEMessage);
			break;
        case B:
			iReturnValue=Process_B_Message(&s_CBEMessage);
			break;
		case C:
			iReturnValue=Process_C_Message(&s_CBEMessage);
			break;
		default:
#ifdef DEBUG_PRINT
            printf("Unknow Message Area.\n"); 
#endif
			break;
		}

		printf("Rece_CBE_Buf.iTail=%d\n\n",Rece_CBE_Buf.iTail);
//        AppendCBESendMessage(&s_CBEMessage);
	}

    for(;;)
	{
		scanf("%c",&presskey);
		if (presskey=='q') 
		{
			break;
		}
		printf("\n");
	}

	return SUCCESS;
}


//处理A区消息
int Process_A_Message(CBEMESSAGE_t *s_CBEMessage)
{
	int iReturnValue;
	PID_t s_SelectedPid;
    /* 内部格式缓冲区 */
	CBEMESSAGE_t s_ProxyMessage;

#ifdef  OPEN_WARNING
	/* 告警描述 */
	unsigned char cWarningDescription[WARNING_DESC_LEN];
#endif

#ifdef DEBUG_PRINT
    printf("------------------\n");         
	printf("Receive Message in A Area.\n"); 
#endif

	s_SelectedPid.cModuleId=MODULEID;     //s_CBEMessage->s_MessageHead.s_ReceiverPid.cModuleId;
	s_SelectedPid.cFunctionId=FUNCTIONID; //s_CBEMessage->s_MessageHead.s_ReceiverPid.cFunctionId; 
	
	switch (s_CBEMessage->s_MessageHead.iMessageType)
	{
	case CBCPROXY_WRITE_REPLACE:/* CBSE_WRITE_REPLACE: */
		{

#ifdef DEBUG_PRINT
            printf("Receive CBCPROXY_WRITE_REPLACE Message in A Area.\n\n"); 
#endif

			memset(&s_ProxyMessage,0,sizeof(CBEMESSAGE_t));
			/* 转换参数 */
			iReturnValue=Convert_Write_Replace_Request(s_CBEMessage,&s_ProxyMessage);	
			if (iReturnValue==FAILURE)
			{
#ifdef  OPEN_WARNING
				/* 发送告警给OMP */
				memset(cWarningDescription,0,WARNING_DESC_LEN);
   				sprintf(cWarningDescription,"写入或替换包错误");
				SendWarningToOmp(LINK_WARNING,ERROR_PACK,cWarningDescription);
#endif
				/* 扔掉错误消息 */
				return FAILURE;
			}

			/* 分配逻辑进程 */
			s_SelectedPid.iProcessId=alloc_pid((char *)&s_SelectedPid);
			if ( s_SelectedPid.iProcessId < 0 )
			{
				printf("Creat Process Error\n");
				return FAILURE;
			}

			iReturnValue=Process_Write_Replace_Request((unsigned char *)&s_ProxyMessage,s_SelectedPid);
			
			/* 出错 */
			if (iReturnValue<0)
			{
	#ifdef DEBUG_PRINT
				printf("Process_Write_Replace_Request return error.ErrorCode=%d\n",iReturnValue); 
	#endif	
				Process_Write_Replace_Error(s_SelectedPid,iReturnValue);
					
			}

			if (iReturnValue!=CONTINUANCE)
			{
				/* 释放进程 */
				if (free_pid((char *)&s_SelectedPid)<0)
				{
					printf("Free pid Error,Pid=%d\n",s_SelectedPid.iProcessId); 
				}
			}


		}

		break;
		
	case CBCPROXY_KILL_MESSAGE:/* CBSE_KILL_MESSAGE: */
		{
#ifdef DEBUG_PRINT
            printf("Receive CBCPROXY_KILL_MESSAGE Message in A Area.\n\n"); 
#endif

			memset(&s_ProxyMessage,0,sizeof(CBEMESSAGE_t));
			/* 转换参数 */
			iReturnValue=Convert_KillMessage(s_CBEMessage,&s_ProxyMessage);	
			if (iReturnValue==FAILURE)
			{
#ifdef  OPEN_WARNING
				/* 发送告警给OMP */
				memset(cWarningDescription,0,WARNING_DESC_LEN);
   				sprintf(cWarningDescription,"删除包错误");
				SendWarningToOmp(LINK_WARNING,ERROR_PACK,cWarningDescription);
#endif
				/* 扔掉错误消息 */
				return FAILURE;
			}

#ifdef  OPEN_STATISTIC			
			s_CBSECount.s_CbcProxyReqCnt.iCBCProxyKillReqCnt++;
#endif

			s_SelectedPid.iProcessId=alloc_pid((char *)&s_SelectedPid);
			if ( s_SelectedPid.iProcessId < 0 )
			{
				printf("Creat Process Error\n");
				return FAILURE;
			}	

			iReturnValue=Process_CBSE_KILL_MESSAGE((unsigned char *)&s_ProxyMessage,s_SelectedPid);

			/* 出错 */
			if (iReturnValue<0)
			{
	#ifdef DEBUG_PRINT
				printf("Process_KillMessage return error.ErrorCode=%d\n",iReturnValue); 
	#endif	
				Process_CBE_Message_Error(s_SelectedPid,iReturnValue);

			}

			if (iReturnValue!=CONTINUANCE)
			{
				/* 释放进程 */
				if (free_pid((char *)&s_SelectedPid)<0)
				{
					printf("Free pid Error,Pid=%d\n",s_SelectedPid.iProcessId); 
				}
			}


		}

		break;
		
	case CBCPROXY_STATUS_CBCH_QUERY:/* CBSE_STATUS_CBCH_QUERY: */
		{
			memset(&s_ProxyMessage,0,sizeof(CBEMESSAGE_t));
			/* 转换参数 */
			iReturnValue=Convert_StatusCBCHQuery(s_CBEMessage,&s_ProxyMessage);	
			if (iReturnValue==FAILURE)
			{
#ifdef  OPEN_WARNING
				/* 发送告警给OMP */
				memset(cWarningDescription,0,WARNING_DESC_LEN);
   				sprintf(cWarningDescription,"信道负荷查询包错误");
				SendWarningToOmp(LINK_WARNING,ERROR_PACK,cWarningDescription);
#endif
				/* 扔掉错误消息 */
				return FAILURE;
			}

#ifdef  OPEN_STATISTIC			
			s_CBSECount.s_CbcProxyReqCnt.iCBCProxyCBCHReqCnt++;
#endif
			
			s_SelectedPid.iProcessId=alloc_pid((char *)&s_SelectedPid);
			if ( s_SelectedPid.iProcessId < 0 )
			{
				printf("Creat Process Error\n");
				return FAILURE;
			}	

			iReturnValue=Process_STATUS_CBCH_QUERY((unsigned char *)&s_ProxyMessage.iLen,s_SelectedPid);

			/* 出错 */
			if (iReturnValue<0)
			{
	#ifdef DEBUG_PRINT
				printf("Process_StatusCBCHQuery return error.ErrorCode=%d\n",iReturnValue); 
	#endif	
				Process_CBE_Message_Error(s_SelectedPid,iReturnValue);
			}

			if (iReturnValue!=CONTINUANCE)
			{
				/* 释放进程 */
				if (free_pid((char *)&s_SelectedPid)<0)
				{
					printf("Free pid Error,Pid=%d\n",s_SelectedPid.iProcessId); 
				}
			}


		}

		break;
		
	case CBCPROXY_STATUS_MESSAGE_QUERY:/* CBSE_STATUS_MESSAGE_QUERY: */
		{
#ifdef DEBUG_PRINT
            printf("Receive CBCPROXY_STATUS_MESSAGE_QUERY Message in A Area.\n\n"); 
#endif
			memset(&s_ProxyMessage,0,sizeof(CBEMESSAGE_t));
			/* 转换参数 */
			iReturnValue=Convert_StatusMessageQuery(s_CBEMessage,&s_ProxyMessage);	
			if (iReturnValue==FAILURE)
			{
#ifdef  OPEN_WARNING
				/* 发送告警给OMP */
				memset(cWarningDescription,0,WARNING_DESC_LEN);
   				sprintf(cWarningDescription,"消息查询包错误");
				SendWarningToOmp(LINK_WARNING,ERROR_PACK,cWarningDescription);
#endif
				/* 扔掉错误消息 */
				return FAILURE;
			}

#ifdef  OPEN_STATISTIC			
			s_CBSECount.s_CbcProxyReqCnt.iCBCProxyMsgQueryCnt++;
#endif

			s_SelectedPid.iProcessId=alloc_pid((char *)&s_SelectedPid);
			if ( s_SelectedPid.iProcessId < 0 )
			{
				printf("Creat Process Error\n");
				return FAILURE;
			}	

			iReturnValue=Process_STATUS_MESSAGE_QUERY((unsigned char *)&s_CBEMessage->iLen,s_SelectedPid);

			/* 出错 */
			if (iReturnValue<0)
			{
	#ifdef DEBUG_PRINT
				printf("Process_StatusMessageQuery return error.ErrorCode=%d\n",iReturnValue); 
	#endif	
				Process_CBE_Message_Error(s_SelectedPid,iReturnValue);
			}

			if (iReturnValue!=CONTINUANCE)
			{
				/* 释放进程 */
				if (free_pid((char *)&s_SelectedPid)<0)
				{
					printf("Free pid Error,Pid=%d\n",s_SelectedPid.iProcessId); 
				}
			}

		}
		break;
	case CBCPROXY_RESET:/* RESET */
		{
#ifdef DEBUG_PRINT
            printf("Receive CBCPROXY_RESET Message in A Area.\n\n"); 
#endif
			memset(&s_ProxyMessage,0,sizeof(CBEMESSAGE_t));
			/* 转换参数 */
			iReturnValue=Convert_Reset(s_CBEMessage,&s_ProxyMessage);	
			if (iReturnValue==FAILURE)
			{
#ifdef  OPEN_WARNING
				/* 发送告警给OMP */
				memset(cWarningDescription,0,WARNING_DESC_LEN);
   				sprintf(cWarningDescription,"重启包错误");
				SendWarningToOmp(LINK_WARNING,ERROR_PACK,cWarningDescription);
#endif
				/* 扔掉错误消息 */
				return FAILURE;
			}

#ifdef  OPEN_STATISTIC			
			s_CBSECount.s_CbcProxyReqCnt.iCBCProxyResetCnt++;
#endif

			s_SelectedPid.iProcessId=alloc_pid((char *)&s_SelectedPid);
			if ( s_SelectedPid.iProcessId < 0 )
			{
				printf("Creat Process Error\n");
				return FAILURE;
			}	

			iReturnValue=Process_RESET((unsigned char *)&s_ProxyMessage.iLen,s_SelectedPid);

			/* 出错 */
			if (iReturnValue<0)
			{
	#ifdef DEBUG_PRINT
				printf("Process_Reset return error.ErrorCode=%d\n",iReturnValue); 
	#endif	
				Process_CBE_Message_Error(s_SelectedPid,iReturnValue);
			}

			if (iReturnValue!=CONTINUANCE)
			{
				/* 释放进程 */
				if (free_pid((char *)&s_SelectedPid)<0)
				{
					printf("Free pid Error,Pid=%d\n",s_SelectedPid.iProcessId); 
				}
			}


		}
		break;

	case CBCPROXY_SET_DRX:/* CBSE_SET_DRX: */
		{
			memset(&s_ProxyMessage,0,sizeof(CBEMESSAGE_t));
			/* 转换参数 */
			iReturnValue=Convert_SETDRX(s_CBEMessage,&s_ProxyMessage);	
			if (iReturnValue==FAILURE)
			{
#ifdef  OPEN_WARNING
				/* 发送告警给OMP */
				memset(cWarningDescription,0,WARNING_DESC_LEN);
   				sprintf(cWarningDescription,"设置不连续接收包错误");
				SendWarningToOmp(LINK_WARNING,ERROR_PACK,cWarningDescription);
#endif
				/* 扔掉错误消息 */
				return FAILURE;
			}

			s_SelectedPid.iProcessId=alloc_pid((char *)&s_SelectedPid);
			if ( s_SelectedPid.iProcessId < 0 )
			{
				printf("Creat Process Error\n");
				return FAILURE;
			}	
		
			iReturnValue=Process_SET_DRX((unsigned char *)&s_CBEMessage->iLen,s_SelectedPid);

			/* 出错 */
			if (iReturnValue<0)
			{
	#ifdef DEBUG_PRINT
				printf("Process_SetDRX return error.ErrorCode=%d\n",iReturnValue); 
	#endif	
				Process_CBE_Message_Error(s_SelectedPid,iReturnValue);
			}

			if (iReturnValue!=CONTINUANCE)
			{
				/* 释放进程 */
				if (free_pid((char *)&s_SelectedPid)<0)
				{
					printf("Free pid Error,Pid=%d\n",s_SelectedPid.iProcessId); 
				}
			}


		}

		break;
	default:
		/* 不认识的消息类别 */
#ifdef  OPEN_WARNING		
		/* 发送告警给OMP */
		memset(cWarningDescription,0,WARNING_DESC_LEN);
		sprintf(cWarningDescription,"无法识别的消息类型");
		SendWarningToOmp(LINK_WARNING,ERROR_PACK,cWarningDescription);
#endif

#ifdef DEBUG_PRINT
            printf("Unknow MessageType in A Area.\n"); 
#endif
			break;
		}
		return SUCCESS;
}


/* 处理定时器到时消息 */
int Process_B_Message(CBEMESSAGE_t *s_CBEMessage)
{
	struct timer_expire_message_t *LPTimerExpireMessage;
	int                           iReturnValue;
	PID_t                         s_Pid;

	LPTimerExpireMessage=(struct timer_expire_message_t *)s_CBEMessage;

	memcpy(&s_Pid,&LPTimerExpireMessage->owner,sizeof(PID_t));

	/* 杀掉定时器 */
	iReturnValue=kill_timer(LPTimerExpireMessage->timer_id, (char *)&LPTimerExpireMessage->owner);
	if(iReturnValue<0)
	{
		printf("Kill timer Error!TimerId=%d\n",LPTimerExpireMessage->timer_id);
		//sys error
		return FAILURE;
	}

⌨️ 快捷键说明

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