?? x25function.c
字號:
#include "..\sys\Include.h "
int AllocBscConnectInfo();
int ReleaseBscConnectInfo(int Tid);
int Process_BSC_Message(char *MessageBuf,int Len,int Tid);
/* 從X25發(fā)送消息緩沖區(qū)中取出一條消息信息
WaitTime_len: 等待時長ms
* 返回
<0: 超時
>1: 成功
*/
int X25GetCBESendMsg(BSCMESSAGE_t *s_BSCMessage,int Tid, int WaitTime_len);
//檢查綁定參數(shù)
int Process_VBind_init(VBIND_t *s_VBind);
/*
//連接到BSC并綁定
int ConnectToBsc(CBEMESSAGE_t *s_CBEMessage)
{
int iReturnValue;
int Tid;
char *BscIdetifier;
VBIND_t *LPVbind;
char PackBindBuf[1024];
char UnpackBind[1024];
int len;
unsigned char sUserInfo[128];
unsigned char nUserInfoLen=1;
memset(PackBindBuf,0,1024);
LPVbind=(VBIND_t *)&s_CBEMessage->cMessage[0];
iReturnValue=Process_VBind_init(LPVbind);
if (iReturnValue<0)
{
return iReturnValue;
}
BscIdetifier=LPVbind->BSCIdentifier;
//BscConnectInfo是否配置
if (Tid=GetTid(BscIdetifier)<0)
{
printf("Unrecognized BSC!\n");
return UNRECOGNIZED_BSC;
}
//是否已經(jīng)綁定
if (s_BscConnectInfo[Tid].DownlinkStatus==BSC_STEADY)
{
printf("Already bind!\n");
return ALREADY_BIND;
}
if ((s_BscConnectInfo[Tid].X25DownlinkHandle=CallToRemote(s_BscConnectInfo[Tid].BscAddr, g_X25LocalAddr, s_BscConnectInfo[Tid].BscPort, sUserInfo, nUserInfoLen, 1))<0)
{
printf("X25connect error!\n");
return X25_ERROR;
}
else
{
printf("X25 connected!\n");
//進行綁定操作
//結(jié)果報告給cbc_proxy
//set cbc status
len=Pack_cbse_VBIND(LPVbind,PackBindBuf);
//發(fā)送X25綁定請求數(shù)據(jù)
X25SendData(s_BscConnectInfo[Tid].X25DownlinkHandle,PackBindBuf,len );
//接受綁定結(jié)果參數(shù)
len=X25RecvData(s_BscConnectInfo[Tid].X25DownlinkHandle, UnpackBind);
if (len<0)
{
return X25_ERROR;
}
//綁定失敗
if (UnpackBind[0]!=CBSE_BIND_CONFIRM)
{
memset(&CBCBSC_Unpack,0,sizeof(CBC_BSC_UNPACK_t));
CbcBscUnpackAMessage((MESSAGE_t *)&UnpackBind[0],len);
return BSC_BIND_FAILURE;
}
//==========
//發(fā)送接受線程互斥量
s_BscConnectInfo[Tid].ThreadEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
//創(chuàng)建接受數(shù)據(jù)線程
s_BscConnectInfo[Tid].X25ReceiveThreadHandle=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)X25DownLinkRecieveData,&Tid,0,NULL);
/* 創(chuàng)建發(fā)送數(shù)據(jù)線程
s_BscConnectInfo[Tid].X25SendThreadHandle=
CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)X25SendMessage,&Tid,0,NULL);
memset(&s_BscConnectInfo[Tid].s_X25SendMessageBuf,0,sizeof(X25_SEND_MESSAGE_BUF_t));
s_BscConnectInfo[Tid].s_X25SendMessageBuf.MsgFull = CreateSemaphore(NULL,0,X25MSG_QUEUE_SIZE,NULL);
s_BscConnectInfo[Tid].s_X25SendMessageBuf.MsgEmpty = CreateSemaphore(NULL,X25MSG_QUEUE_SIZE,X25MSG_QUEUE_SIZE,NULL);
s_BscConnectInfo[Tid].s_X25SendMessageBuf.MsgMutex = CreateMutex(NULL,FALSE,NULL);
}
/* 延遲一秒,保證創(chuàng)建線程時傳遞的參數(shù)不被釋放
Sleep(1000);
return SUCCESS;
}
*/
void initBscConnectInfo()
{
int i;
memset(s_BscConnectInfo,0,sizeof(BSC_CONNECT_INFO_t)*MAX_BSC_CONNECT);
/* 設(shè)置連接狀態(tài) */
for (i=0;i<MAX_BSC_CONNECT;i++)
{
s_BscConnectInfo[i].DownlinkStatus=BSC_DISCONNECT;
s_BscConnectInfo[i].UplinkStatus=BSC_DISCONNECT;
}
}
/* 根據(jù)BscIdentifier返回s_BscConnectInfo的數(shù)組下標(biāo)Tid */
int GetTid(char *Bsc)
{
int i;
for(i=0;i<MAX_BSC_CONNECT; i++)
{
if (memcmp(&s_BscConnectInfo[i].BscIdentifier,Bsc,BSC_INDENTIFIER_LEN)==0)
{
return i;
}
}
return FAILURE;
}
//分配連接信息數(shù)組
/*
int AllocBscConnectInfo()
{
int i;
for(i=0;i<MAX_BSC_CONNECT; i++)
{
if (s_BscConnectInfo[i].InUse==0)
return i;
}
return FAILURE;
}
//釋放連接信息數(shù)組
int ReleaseBscConnectInfo(int Tid)
{
if ((Tid<0)||(Tid>=MAX_BSC_CONNECT))
return FAILURE;
s_BscConnectInfo[Tid].InUse=0;
ReleaseMutex(s_BscConnectInfo[Tid].ThreadMutex);
return SUCCESS;
}
*/
/* 接受X25數(shù)據(jù) */
void X25DownLinkRecieveData(int *Tid)
{
int nTid;
int Len;
unsigned char ReceiveBuf[MESSAGE_LEN];
#ifdef OPEN_WARNING
/* 統(tǒng)計告警描述字串 */
unsigned char cWarningDescription[WARNING_DESC_LEN];
#endif
nTid=*Tid;
for(;;)
{
/* 需要退出連接 */
if (s_BscConnectInfo[nTid].ConnectOpen==OFF)
{
if (s_BscConnectInfo[nTid].DownlinkStatus==BSC_STEADY)
{
HangupConnectNOWAIT(s_BscConnectInfo[nTid].X25DownlinkHandle,NULL, NULL ,NULL,0);
// HangupConnect(s_BscConnectInfo[nTid].X25DownlinkHandle,&s_BscConnectInfo[nTid].BscAddr[0], g_X25LocalAddr ,NULL,0);
Del_Port_lsn(nTid,0);
s_BscConnectInfo[nTid].DownlinkStatus=BSC_DISCONNECT;
}
ExitThread(1);
}
if ((Len=X25NoWaitRecvData(s_BscConnectInfo[nTid].X25DownlinkHandle , ReceiveBuf ,XD_NOTO,nTid))<=0)
{
s_BscConnectInfo[nTid].DownlinkStatus=BSC_DISCONNECT;
HangupConnectNOWAIT(s_BscConnectInfo[nTid].X25DownlinkHandle,NULL, NULL ,NULL,0);
// HangupConnect(s_BscConnectInfo[nTid].X25DownlinkHandle,&s_BscConnectInfo[nTid].BscAddr[0], g_X25LocalAddr ,NULL,0);
Del_Port_lsn(nTid,0);
printf("X25 downlinkConnect Exit,RemoteAddr=%s\n",s_BscConnectInfo[nTid].BscAddr);
/* 告警 */
#ifdef OPEN_WARNING
memset(cWarningDescription,0,sizeof(WARNING_DESC_LEN));
sprintf(cWarningDescription,"下行連路斷連,BSCID=%d",*((unsigned short *)s_BscConnectInfo[nTid].BscIdentifier));
SendWarningToOmp(LINK_WARNING,BSC_LINK,cWarningDescription);
#endif
ExitThread(1);
break;
}
else
{
Process_BSC_Message(ReceiveBuf,Len,nTid);
}
}
ExitThread(1);
}
/* 處理BSC消息 */
int Process_BSC_Message(char *MessageBuf,int Len,int Tid)
{
unsigned char MessageType;
int iReturnValue;
MessageType=*(unsigned char *)MessageBuf;
memset(&CBCBSC_Unpack,0,sizeof(CBC_BSC_UNPACK_t));
/* 解包BSC操作參數(shù) */
iReturnValue=CbcBscUnpackAMessage((MESSAGE_t *)MessageBuf, Len);
if (iReturnValue<0)
{
printf("Unpack BSC Message Error !\n");
return FAILURE;
}
switch (MessageType)
{
case CBSE_REPORT_SUCCESS: /* Report_Success */
{
#ifdef DEBUG_PRINT
printf("Receive REPORT_SUCCESS Message from BSC, Tid=%d.\n",Tid);
Print_BSC_Response(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
iReturnValue=Process_Response(Tid);
/* 釋放進程 */
if (iReturnValue==END)
{
if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
}
}
// if (iReturnValue<0)
// break;
/* 事件有信號 */
/*
if ((s_BscConnectInfo[Tid].MessageType!=CBSE_STATUS_CBCH_QUERY)
&&(s_BscConnectInfo[Tid].MessageType!=CBSE_STATUS_MESSAGE_QUERY)
&&(s_BscConnectInfo[Tid].MessageType!=CBSE_SET_DRX)
)
SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
}
break;
case CBSE_STATUS_CBCH_QUERY_RESP:/* Status_CBCH_Resp */
{
#ifdef DEBUG_PRINT
printf("Receive STATUS_CBCH_QUERY_RESP from BSC, Tid=%d.\n",Tid);
Print_Status_CBCH_Query_RESP(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
iReturnValue=Process_StatusCBCH_QUERY_RESP(Tid);
/* 釋放進程 */
if (iReturnValue==END)
{
if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
}
}
/* 事件有信號 */
/* if (s_BscConnectInfo[Tid].MessageType==CBSE_STATUS_CBCH_QUERY)
SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
}
break;
case CBSE_STATUS_MESS_QUERY_RESP: /* Status_Mess_Resp */
{
#ifdef DEBUG_PRINT
printf("Receive STATUS_MESSAGE_QUERY_RESP from BSC, Tid=%d.\n",Tid);
Print_StatusMessageQuery_Response(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
iReturnValue=Process_StatusMessage_QUERY_RESP(Tid);
/* 釋放進程 */
if (iReturnValue==END)
{
if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
}
}
/* 事件有信號 */
/* if (s_BscConnectInfo[Tid].MessageType==CBSE_STATUS_MESSAGE_QUERY)
SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
}
break;
case CBSE_REJECT_RESPONSE: /* Report_Failure */
{
/* 事件有信號 */
// SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
}
break;
case CBSE_BSC_RESTART: /* BSC_Restart */
{
#ifdef DEBUG_PRINT
printf("Receive BSC_RESTART from BSC, Tid=%d.\n",Tid);
Print_RestartIndication_Response(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
iReturnValue=Process_BSC_Restart_IND(Tid);
/* 釋放進程 */
if (iReturnValue==END)
{
if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
}
}
/* 事件有信號 */
/* if (s_BscConnectInfo[Tid].MessageType==CBSE_RESET)
{
SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
}
*/
}
break;
case CBSE_FAILURE_IND:/* Failure_Ind */
{
#ifdef DEBUG_PRINT
printf("Receive CBSE_FAILURE_IND from BSC, Tid=%d.\n",Tid);
Print_FailureIndication_Response(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
Process_Failure_IND(Tid);
}
break;
case CBSE_SET_DRX_REPORT:
{
#ifdef DEBUG_PRINT
printf("Receive SET_DRX_REPORT BSC, Tid=%d.\n",Tid);
Print_SETDRX_REPORT_Response(s_BscConnectInfo[Tid].s_Pid,
s_BscConnectInfo[Tid].MessageType,
Tid,
&CBCBSC_Unpack);
#endif
iReturnValue=Process_SET_DRX_REPORT(Tid);
/* 釋放進程 */
if (iReturnValue==END)
{
if (free_pid((char *)&s_BscConnectInfo[Tid].s_Pid)<0)
{
//sys error
printf("Warning! Free Pid Error.pid=%d\n",s_BscConnectInfo[Tid].s_Pid.iProcessId);
}
}
/* 事件有信號 */
/* if (s_BscConnectInfo[Tid].MessageType==CBSE_SET_DRX)
SetEvent(s_BscConnectInfo[Tid].ThreadEvent);
*/
}
break;
default:
printf("Unrecognized Message sent by BSC!\n");
break;
}
return SUCCESS;
}
/* 發(fā)送消息線程函數(shù) */
void X25SendMessage(int *Tid)
{
int nTid;
BSCMESSAGE_t s_BSCMessage;
int len;
unsigned char ReceiveBuf[MESSAGE_LEN];
#ifdef OPEN_WARNING
/* 統(tǒng)計告警描述字串 */
unsigned char cWarningDescription[WARNING_DESC_LEN];
#endif
nTid=*Tid;
for(;;)
{
/* 從消息隊列中取一條數(shù)據(jù) */
for(;;)
{
if(X25GetCBESendMsg(&s_BSCMessage,nTid,2000)==SUCCESS)
{
break;
}
/* 需要退出連接 */
if (s_BscConnectInfo[nTid].ConnectOpen==OFF)
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -