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

📄 x25lib.c

📁 CBS(小区广播)程序实现手稿
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -