📄 x25lib.c
字号:
Request completed successfully!
Connection established!!!!
*/
break;
default: /*OTHERS*/
{
// x25cancel(nCid, NULL);
goto stop;
}
break;
}
/* 等待6秒接收数据*/
len=X25NoWaitRecvData(nCid,unpackbuf,6,nTid);
if (len<0)
{
HangupConnectNOWAIT(nCid,NULL, NULL ,FailureReason,3);
// HangupConnectNOWAIT(nCid,&s_BscConnectInfo[nTid].BscAddr[0], g_X25LocalAddr ,FailureReason,3);
memset(cWarningDescription,0,sizeof(WARNING_DESC_LEN));
sprintf(cWarningDescription,"没有上行绑定参数,BSCID=%d",*(unsigned short *)&s_BscConnectInfo[nTid].BscIdentifier[0]);
goto stop;
}
s_BscConnectInfo[nTid].X25UpLinkHandle=nCid;
s_BscConnectInfo[nTid].CBCOperator[MAX_OPERATOR_LEN]=0;
OperatorCheck=FAILURE;
/* 检查上行操作者 */
WaitForSingleObject(UnpackBindmutex,INFINITE);
if (UnPackcbse_BIND(unpackbuf, len)<0)
{
OperatorCheck=FAILURE;
}
else
{
if (CBCBSC_Unpack.p_Name.s_Operate.bFlag==EXIST)
{
if(strlen(s_BscConnectInfo[nTid].CBCOperator)==CBCBSC_Unpack.p_Name.s_Operate.clength)
{
if (memcmp(s_BscConnectInfo[nTid].CBCOperator,
CBCBSC_Unpack.p_Name.s_Operate.cOperator,
CBCBSC_Unpack.p_Name.s_Operate.clength)==0)
{
OperatorCheck=TRUE;
}
}
}
}
ReleaseMutex(UnpackBindmutex);
if (OperatorCheck==TRUE)
{
/* Operator */
m_bind.p_Name.bFlag=1;
m_bind.p_Name.s_Operate.bFlag=1;
m_bind.p_Name.s_Operate.clength=strlen(s_BscConnectInfo[nTid].BSCOperator);
memcpy(&m_bind.p_Name.s_Operate.cOperator[0],
s_BscConnectInfo[nTid].BSCOperator,
m_bind.p_Name.s_Operate.clength);
/* x25Address */
m_bind.p_Name.s_DataNetWorkAddress.bFlag=1;
m_bind.p_Name.s_DataNetWorkAddress.clength=strlen(g_X25LocalAddr);
memcpy(&m_bind.p_Name.s_DataNetWorkAddress.cXl2lAddress[0],
g_X25LocalAddr,
m_bind.p_Name.s_DataNetWorkAddress.clength);
len=Pack_cbse_VBIND(&m_bind, Senddata);
if (X25NoWaitSendData(nCid,Senddata,len,3,nTid)<0)
{
HangupConnectNOWAIT(nCid,NULL, NULL ,FailureReason,3);
// HangupConnectNOWAIT(nCid,&s_BscConnectInfo[nTid].BscAddr[0], g_X25LocalAddr ,FailureReason,3);
goto stop;
}
x25getconn(nCid, &port, &lsn);
Add_Port_lsn( port, lsn, nTid, 1);
/* 创建接收数据线程 */
s_BscConnectInfo[nTid].X25UpLinkHandle=nCid;
s_BscConnectInfo[nTid].UplinkStatus=BSC_STEADY;
CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)X25UplinkRecieveData,&nTid,0,NULL);
}
else/* 参数非法 */
{
/* 释放链路 */
HangupConnectNOWAIT(nCid,NULL, NULL ,FailureReason,3);
// HangupConnectNOWAIT(nCid,&s_BscConnectInfo[nTid].BscAddr[0], g_X25LocalAddr ,FailureReason,3);
#ifdef OPEN_WARNING
memset(cWarningDescription,0,sizeof(WARNING_DESC_LEN));
sprintf(cWarningDescription,"上行绑定参数错误,BSCID=%d",*(unsigned short *)&s_BscConnectInfo[nTid].BscIdentifier[0]);
SendWarningToOmp(LINK_WARNING,BSC_LINK,cWarningDescription);
#endif
}
}
stop: Sleep(2000);
}
/* 返回连接句柄 */
}
/* 每次申请的空间是你的空间 */
unsigned char *MakeAlloc()
{
return x25alloc(X25_MAXDATALEN);
}
//发送数据
int X25SendData(int nCid , unsigned char *sData , int nLen ,int Tid)
{
OSINT nInfo = 0;
memcpy((unsigned char *) sSendBuff[Tid] , (unsigned char *) sData , nLen);
if ( x25send(nCid, sSendBuff[Tid] , nLen, nInfo, X25NULLFN) < 0 )
{
printf("\n error = %d \n" , x25error() ) ;
return FAILURE ;
}
return SUCCESS ;
}
/* 接收数据 */
int X25RecvData( int nCid , unsigned char *sData ,int Tid)
{
OSINT nInfo = 0;
int nRet = -1 ;
// if ( (nRet =x25recv(nCid, sRecvBuff[Tid], X25_MAXDATALEN, &nInfo, X25NULLFN)) < 0 )
{
printf("error = %d \n" ,x25error());
return FAILURE ;
}
// memcpy(sData , sRecvBuff[Tid] , nRet );
return nRet;
}
/* 非等待模式接收数据 */
int X25NoWaitRecvData(int nCid,unsigned char *sData,int timeout,int Tid)
{
OSINT nInfo =0;
struct x25doneinfo done_info; /*Completed request information*/
unsigned char * Lp_RecvBuf;
int error;
if ( (Lp_RecvBuf=x25alloc(X25_MAXDATALEN)) == NULL )
{
return FAILURE;
}
// if(x25recv(nCid, sRecvBuff[Tid], X25_MAXDATALEN, &nInfo, X25NULLFN)<0)
if(x25recv(nCid, Lp_RecvBuf, X25_MAXDATALEN, &nInfo, X25NULLFN)<0)
{
x25free(Lp_RecvBuf);
return FAILURE;
}
if (x25done(nCid, timeout, &done_info) < 0)
{
error = x25error();
/* the request hasn't completed,cancel request */
if (error == EX25DONETO)
// if (error == ENETPEND)
{
//Submit the cancel. X25cancel is always submitted in wait mode.
if (x25cancel(nCid, Lp_RecvBuf)< 0 )
{
//x25cancel() failed
error = x25error();
if (error != ENETICMD)
{
/*
Do error handling
*/
}
}
else
{
/* X25cancel */
x25done(nCid, XD_TONOW, &done_info);
}
x25free(Lp_RecvBuf);
/* 超时 */
return RECV_TIME_OUT;
}
x25free(Lp_RecvBuf);
return FAILURE;
}
switch (done_info.xi_retcode)
{
case 0:
{
/*
Request completed successfully!
*/
memcpy(sData,done_info.xi_buf,done_info.xi_len);
x25free(Lp_RecvBuf);
return done_info.xi_len;
}
break;
default:
{
x25free(Lp_RecvBuf);
return FAILURE;
}
break;
}
}
/* 非等待模式发送数据 */
int X25NoWaitSendData(int nCid,unsigned char *sData,int nLen,int timeout,int Tid)
{
OSINT nInfo = 0;
struct x25doneinfo done_info; /*Completed request information*/
int error;
memcpy((unsigned char *) sSendBuff[Tid] , (unsigned char *) sData , nLen);
if ( x25send(nCid, sSendBuff[Tid] , nLen, nInfo, X25NULLFN) < 0 )
{
return FAILURE ;
}
if (x25done(nCid, timeout, &done_info) < 0)
{
error = x25error();
/* the request hasn't completed,cancel request */
if (error == ENETPEND)
{
//Submit the cancel. X25cancel is always submitted in wait mode.
if (x25cancel(nCid, sSendBuff[Tid])< 0 )
{
//x25cancel() failed
error = x25error();
if (error != ENETICMD)
{
/*
Do error handling
*/
}
}
else
{
/* X25cancel */
x25done(nCid, XD_TONOW, &done_info);
}
}
return FAILURE;
}
switch (done_info.xi_retcode)
{
case 0:
{
/*
Request completed successfully!
*/
return nLen;
}
break;
default:
{
return FAILURE;
}
break;
}
}
int HangupConnect( int nCid,char *sRemoteAddr , char *sLocalAddr ,char *Userdata,int Userdatalen)
{
OSINT nInfo = 0;
unsigned char cCause;
unsigned char cDiag;
struct x25data rFacility;
struct x25data rUserData;
char local_dte[X25_ADDRLEN+X25_ADDREXT+2];
char remote_dte[X25_ADDRLEN+X25_ADDREXT+2];
memset(local_dte,0,X25_ADDRLEN+X25_ADDREXT+2);
memset(remote_dte,0,X25_ADDRLEN+X25_ADDREXT+2);
if (sRemoteAddr!=NULL)
{
memcpy(remote_dte,sRemoteAddr,strlen(sRemoteAddr));
}
if (sLocalAddr!=NULL)
{
memcpy(local_dte,sLocalAddr,strlen(sLocalAddr));
}
rFacility.xd_len = 0;
rUserData.xd_len=0;
if ((Userdatalen>0)&&(Userdatalen<16))
{
rUserData.xd_len = Userdatalen;
memcpy(rUserData.xd_data,Userdata,Userdatalen);
}
cCause = '0';
cDiag = '0';
if ( x25xhangup(nCid,cCause,cDiag,remote_dte,local_dte,&rFacility, &rUserData,XH_IMM,X25NULLFN) < 0 )
{
printf("send the hangup fail. . error=%d\n" , x25error());
return FAILURE;
}
return SUCCESS;
}
int HangupConnectNOWAIT( int nCid,char *sRemoteAddr , char *sLocalAddr ,char *Userdata,int Userdatalen)
{
OSINT nInfo = 0;
unsigned char cCause;
unsigned char cDiag;
struct x25data rFacility;
struct x25data rUserData;
char local_dte[X25_ADDRLEN+X25_ADDREXT+2];
char remote_dte[X25_ADDRLEN+X25_ADDREXT+2];
int error;
struct x25doneinfo done_info;
memset(local_dte,0,X25_ADDRLEN+X25_ADDREXT+2);
memset(remote_dte,0,X25_ADDRLEN+X25_ADDREXT+2);
if (sRemoteAddr!=NULL)
{
memcpy(remote_dte,sRemoteAddr,strlen(sRemoteAddr));
}
if (sLocalAddr!=NULL)
{
memcpy(local_dte,sLocalAddr,strlen(sLocalAddr));
}
rFacility.xd_len = 0;
rUserData.xd_len=0;
if ((Userdatalen>0)&&(Userdatalen<16))
{
rUserData.xd_len = Userdatalen;
memcpy(rUserData.xd_data,Userdata,Userdatalen);
}
cCause = '0';
cDiag = '0';
if ( x25xhangup(nCid,cCause,cDiag,remote_dte,local_dte,&rFacility, &rUserData,XH_IMM,X25NULLFN) < 0 )
{
printf("send the hangup fail. . error=%d\n" , x25error());
return FAILURE;
}
while ( x25done(nCid, 5, &done_info) < 0 )
{
/*
X25done() failed. If the error is ENETPEND, then
the request hasn't completed - keep polling.
Otherwise, we have a less recoverable error - exit.
*/
error = x25error();
if (error != ENETPEND)
{
return FAILURE;
/*
Do error handling
*/
}
}
switch (done_info.xi_retcode)
{
case 0:
/*
Request completed successfully!
The cid and resources have been freed.
*/
break;
default:
/*
Handle remaining return codes.
See list of return codes.
*/
return FAILURE;
break;
}
return SUCCESS;
}
/* 下行链路连接并绑定 */
void X25DownlinkConnect(int *nTid)
{
int Cid;
int Tid;
int len;
unsigned char cSendData[200];
unsigned char BindRecBuf[200];
/* Bind */
VBIND_t m_bind;
/* X25卡的端口号和逻辑会话号 */
unsigned OSINT port; /* EiconCard port number */
unsigned OSINT lsn; /* logical session number */
#ifdef OPEN_WARNING
/* 告警描述字串 */
unsigned char cWarningDescription[WARNING_DESC_LEN];
unsigned char IfAlreadyWarning1=0;
unsigned char IfAlreadyWarning2=0;
#endif
char local_dte[X25_ADDRLEN+X25_ADDREXT+2];
char remote_dte[X25_ADDRLEN+X25_ADDREXT+2];
Tid=*nTid;
for(;;)
{
/* BSC小区配置被删除退出连接请求 */
if (s_BSCCellInfo[Tid].bFlag==0)
{
/* 下行连接线程退出 */
s_BscConnectInfo[Tid].DownlinkThreadOpen=OFF;
#ifdef DEBUG_PRINT
// printf("Downlink Thread exit, BSCID=%d\n",Tid);
#endif
// ExitThread(1);
}
/* 需要退出连接 */
if (s_BscConnectInfo[Tid].ConnectOpen==OFF)
{
if (s_BscConnectInfo[Tid].DownlinkStatus==BSC_STEADY)
{
HangupConnectNOWAIT(s_BscConnectInfo[Tid].X25DownlinkHandle,NULL, NULL ,NULL,0);
// HangupConnect(s_BscConnectInfo[Tid].X25DownlinkHandle,&s_BscConnectInfo[Tid].BscAddr[0], g_X25LocalAddr ,NULL,0);
Del_Port_lsn(Tid,0);
s_BscConnectInfo[Tid].DownlinkStatus=BSC_DISCONNECT;
}
/* 下行连接线程退出 */
s_BscConnectInfo[Tid].DownlinkThreadOpen=OFF;
#ifdef DEBUG_PRINT
printf("Downlink Thread exit, BSCID=%d\n",*(unsigned short *)&s_BscConnectInfo[Tid].BscIdentifier[0]);
#endif
ExitThread(1);
}
if(s_BscConnectInfo[Tid].DownlinkStatus==BSC_DISCONNECT)
{
s_BscConnectInfo[Tid].BscAddr[BSC_ADDR_LEN]=0;
/* 填写地址 */
memset(local_dte,0,X25_ADDRLEN+X25_ADDREXT+2);
memset(remote_dte,0,X25_ADDRLEN+X25_ADDREXT+2);
memcpy(remote_dte,s_BscConnectInfo[Tid].BscAddr,BSC_ADDR_LEN);
memcpy(local_dte,g_X25LocalAddr,BSC_ADDR_LEN);
Cid=CallToRemote( remote_dte , local_dte , PORT , NULL , 0 , 0);
if(Cid<0)
{
#ifdef OPEN_WARNING
/* 保证只发一次告警 */
if (IfAlreadyWarning1==0)
{
memset(cWarningDescription,0,WARNING_DESC_LEN);
sprintf(cWarningDescription,"请求连接失败,BSCID=%d",*(unsigned short *)&s_BscConnectInfo[Tid].BscIdentifier[0]);
/* 发送告警给OMP */
SendWarningToOmp(LINK_WARNING,BSC_LINK,cWarningDescription);
IfAlreadyWarning1=1;
}
#endif
}
else
{
s_BscConnectInfo[Tid].BSCOperator[MAX_OPERATOR_LEN]=0;
memset(cSendData,0,200);
/* Operator */
m_bind.p_Name.bFlag=1;
m_bind.p_Name.s_Operate.bFlag=1;
m_bind.p_Name.s_Operate.clength=strlen(s_BscConnectInfo[Tid].CBCOperator);
memcpy(&m_bind.p_Name.s_Operate.cOperator[0],
s_BscConnectInfo[Tid].CBCOperator,
m_bind.p_Name.s_Operate.clength);
/* x25Address */
m_bind.p_Name.s_DataNetWorkAddress.bFlag=1;
m_bind.p_Name.s_DataNetWorkAddress.clength=strlen(g_X25LocalAddr);
memcpy(&m_bind.p_Name.s_DataNetWorkAddress.cXl2lAddress[0],
g_X25LocalAddr,
m_bind.p_Name.s_DataNetWorkAddress.clength);
len=Pack_cbse_VBIND(&m_bind, cSendData);
X25NoWaitSendData(Cid,cSendData,len,XD_NOTO,Tid);
len=X25NoWaitRecvData(Cid , BindRecBuf,XD_NOTO,Tid);
if(len<0)
{
#ifdef OPEN_WARNING
/* 保证只发一次告警 */
if(IfAlreadyWarning2==0)
{
/* 发送告警给OMP */
memset(cWarningDescription,0,WARNING_DESC_LEN);
sprintf(cWarningDescription,"下行绑定参数错误,BSCID=%d",*(unsigned short *)&s_BscConnectInfo[Tid].BscIdentifier[0]);
SendWarningToOmp(LINK_WARNING,BSC_LINK,cWarningDescription);
IfAlreadyWarning2=1;
}
#endif
s_BscConnectInfo[Tid].DownlinkStatus=BSC_DISCONNECT;
}
else
{
/* 保存下行port和lsn */
x25getconn(Cid, &port, &lsn);
Add_Port_lsn(port,lsn,Tid,0);
s_BscConnectInfo[Tid].DownlinkStatus=BSC_STEADY;
s_BscConnectInfo[Tid].X25DownlinkHandle=Cid;
/* 发送接受线程事件 */
// s_BscConnectInfo[Tid].ThreadEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
/* 创建发送数据线程 */
// s_BscConnectInfo[Tid].X25ReceiveThreadHandle=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)X25DownLinkRecieveData,&Tid,0,NULL);
/* 创建接受发送数据线程 */
s_BscConnectInfo[Tid].X25SendThreadHandle=
CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)X25SendMessage,&Tid,0,NULL);
#ifdef OPEN_WARNING
IfAlreadyWarning1=0;
IfAlreadyWarning2=0;
#endif
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);
/* 重启小区 */
Reset_When_Connect(Tid);
}
}
}
/* 每5秒请求一次连接 */
Sleep(5000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -