?? cbcmain.c
字號:
#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 + -