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

📄 ipcclnt.cpp

📁 ABis无线接口全套资料
💻 CPP
字号:
/* ======================================================================== *\
 |
 |
 |  JOYIT Communication Technology
 |  Copyright (C)  2002-2003,  All Right Reserved.
 |
 |  System: Programmable Signaling Gateway
 |  Sub-system: PSG
 |  Filename: ipcclnt.cpp
 |  Environment: Red Hat Linux 9.0 & GNU C/C++ Compiler 3.2.2
 |  Function description: Client of SYSMGR.Function included:
 |
\* ======================================================================== */

#ifndef _IPCCLNT_HPP
#include "ipcclnt.hpp"
#endif

#ifndef _EVENT_HPP
#include "event.hpp"
#endif

extern "C"
{
#include <stdio.h>
#include <unistd.h>
#include <sys/msg.h>
#include <signal.h>
#include <errno.h>
};

//catpure the signaling SIGALRM -- DO NOT EXIT
void sig_alrm(int g);

void sig_alrm(int g)
{

}

CIPCClient::CIPCClient()
{
    m_iLocalMsgQueID=-1;
}

CIPCClient::~CIPCClient()
{
    //Delete the message queue created by itself
    if(m_iLocalMsgQueID!=-1)
        msgctl(m_iLocalMsgQueID,IPC_RMID,NULL);
}

////////////////////////////////////////////////////////////////
//
//  Initialize.
//  First read configuation file
//  Then locate the ICP's queue and creat a queue of it's own
//  At last reigister to SYSMGR
//
//  iRID   --  Real model ID
//  RETURN      0       succeed
//              -1      failed
//
//  ///////////////////////////////////////////////////////////
int CIPCClient::Init(int iRID)
{
	m_iRealID=iRID;
	
    char path[128];
    
	getcwd(path,128);
	strcpy(m_caPath,path);

	//Locate message queue created by SYSMGR(IPC)
    m_iRemoteMsgQueID=msgget(IPC_QUEUE_KEYID,0777| IPC_EXCL);
    if(m_iRemoteMsgQueID<0)
    {
        printf("SYSMGR not running\n");
        return PSG_ERR_IPCNOEXIST;
    }

	msqid_ds		sqid;
	//creat a message of myself to receive message from SGSMGR
	m_iLocalMsgQueID=msgget((iRID<<4),0);
 	if(m_iLocalMsgQueID>0)// if the specified system message queue already exists
  	{
  		if(msgctl(m_iLocalMsgQueID,IPC_STAT,&sqid)<0)
		{
			m_iLocalMsgQueID=-1;
			return -1;
		}

		printf("pid=%d\n",sqid.msg_lrpid);

		if(kill(sqid.msg_lrpid,0) < 0)
		{
			printf("Detect an existed message queue did not work anymore and remove it.\n");
			if(msgctl(m_iLocalMsgQueID,IPC_RMID,NULL)<0)//Remove it
			{
				printf("Cannot start:cannot delete exsiting message queue\n");
				m_iLocalMsgQueID=-1;
				return -1;
			}
			m_iLocalMsgQueID=msgget((iRID<<4),(0777 | IPC_CREAT));//then creat
			if(m_iLocalMsgQueID<0)
			{
				printf("Cannot start:cannot create message queue.\n");
				return -1;
			}
		}
		else
		{
			printf("Cannot start:another process(id=%d) is running\n",sqid.msg_lrpid);
			m_iLocalMsgQueID=-1;
			return -1;
		}
	}
	else
	{
		m_iLocalMsgQueID=msgget((iRID<<4),(0777 | IPC_CREAT));//then creat
		if(m_iLocalMsgQueID<0)
		{
 			printf("Cannot start:cannot create message queue.\n");
			return -1;
		}
	}

	/*
	//-------->>>>>>>>>
	UINT8 q=15;

	for(t=15;t>=0;t--)
	{
			m_iLocalMsgQueID=msgget((iRID<<4)+t,(0777 | IPC_EXCL));
			if(m_iLocalMsgQueID<0)
			{
				q=t;
				continue;
			}

			msgctl(m_iLocalMsgQueID,IPC_STAT,&sqid);
			if(kill(sqid.msg_lrpid,0)>=0)
				continue;

			msgctl(m_iLocalMsgQueID,IPC_RMID,NULL);
			q=t;
	}

	if(q>=15)
		return PSG_ERR_CREATQUE;

	m_iLocalMsgQueID=msgget((iRID<<4)+q,(0777 | IPC_CREAT));
	if(m_iLocalMsgQueID<0)
	{
		printf("Creat local message queue failed.\n");
		return PSG_ERR_CREATQUE;
	}

	//<<<<<<<<<---------
	*/

	msgctl(m_iLocalMsgQueID,IPC_STAT,&sqid);

	sqid.msg_qbytes=100000;
	msgctl(m_iLocalMsgQueID,IPC_SET,&sqid);

    //signal(SIGALRM,sig_alrm);

	//Register to SYSMGR
    int tt=-1;
    tt=Register();

    if(tt<0)
    {
        printf("Register failed.\n");
        return -1;
    }

#ifdef __PSG_REDUNDANT
	m_iRealID=m_sRegister.iNodeStat[m_sRegister.cNodeID];
	printf("Register OK,real ID=%d(NodeID=%d ModelID=%d Total CNT=%d sysmgrpid=%d).\n",
		m_iRealID,
		(m_iRealID & 0xffff0000)>>16,
		(m_iRealID & 0x0000fff0)>>4,
		m_sRegister.cFlag,
		m_sRegister.iSysmgrPid);

	return m_iRealID;
    //return m_sRegister.cFlag;
#else
    if(tt<0)
    {
        printf("Register failed.\n");
        return tt;
    }
	printf("Register OK,real ID=%d(NodeID=%d ModelID=%d)\n",
		tt,
		(tt&0xffff0000)>>16,
		(tt&0x0000fff0)>>4);

	m_iRealID=tt;
    return tt;
#endif
}

#ifdef __PSG_REDUNDANT
int CIPCClient::GetRealMid()
{
	return m_iRealID;
}
#endif

////////////////////////////////////////////////////////////////
//
//  Register.
//              
//  ///////////////////////////////////////////////////////////
int CIPCClient::Register()
{
    WEvent ev;

    //register to SYSMGR
    m_sRegister.iMsgType=SYSMGR_IPC_REGISTER;
    m_sRegister.iMsgQueID=m_iLocalMsgQueID;
    m_sRegister.iPid=getpid();
    strcpy((char *)m_sRegister.caFileName,m_caPath);
#ifdef __PSG_REDUNDANT
    m_sRegister.cFlag=0xff;//SYSMGR ignore this byte
	ev.PtlVer=VER_SYSMGR_REDUNT;
#else
	m_sRegister.iFlag=(UINT32 )-1;//SYSMGR ignore this byte
	ev.PtlVer=VER_SYSMGR;
#endif

    ev.PtlId=PTL_SYSMGR;
    ev.dmid=LMI_SYSMGR;
    ev.smid=m_iRealID;
    ev.Reserved=0;
    ev.Priority=PRO_3;//highest
    ev.evCode=SYSMGR_IPC_REGISTER;
    ev.what=evNetwork;
    ev.msgLen=sizeof(SRegister);
    ev.msgPtr=new char[ev.msgLen];
    ev.PktLength=sizeof(WEvent)+sizeof(SRegister);
   
    memcpy(ev.msgPtr,&m_sRegister,sizeof(SRegister));
   
	int ret=-1;
    ret=SendMsg(ev);
	ev.del();

	if(ret<0)
        return ret;
		    
    int iRecvLen;

    sleep(1);

    iRecvLen=GetMsg(ev);
    if(iRecvLen<=0)
        return -1;
 
    if(ev.PtlId==PTL_SYSMGR)
    {
        if(ev.evCode==SYSMGR_IPC_REGISTER_ACK)
        {
            memcpy(&m_sRegister,ev.msgPtr,sizeof(SRegister));
#ifdef __PSG_REDUNDANT
            if(m_sRegister.cFlag>0)
            {
                //printf("Register to SYSMGR OK\n");
                ev.del();
                return m_sRegister.cFlag;
			}
#else
            if(m_sRegister.iFlag>0)
            {
               // printf("Register to SYSMGR OK,SubID=%d\n",m_sRegister.iFlag);
                ev.del();
				return m_sRegister.iFlag;
            }
#endif
        }
    }
   
    ev.del();
    return PSG_ERR_NORMAL;
}

////////////Modify 2003-08-12
int CIPCClient::Deregister()
{
    WEvent ev;
    
    //deregister to SYSMGR
    m_sDeregister.iMsgType=SYSMGR_IPC_DEREGISTER;
    m_sDeregister.bFlag=1;//SYSMGR ignore this byte

    //SMsgHeader sHead;

    ev.PtlId=PTL_SYSMGR;
    ev.PtlVer=VER_SYSMGR;
    ev.dmid=LMI_SYSMGR;
    ev.smid=m_iRealID;
    ev.Reserved=0;
    ev.Priority=PRO_3;
    ev.evCode=SYSMGR_IPC_DEREGISTER;
    ev.what=evNetwork;
    ev.msgLen=sizeof(SDeregister);
    ev.msgPtr=new char[ev.msgLen];
    ev.PktLength=sizeof(WEvent)+sizeof(SDeregister);
   
    memcpy(ev.msgPtr,&m_sDeregister,sizeof(SDeregister));
   
	int ret=-1;
    ret=SendMsg(ev);
	
	ev.del();
	
	if(ret<0)
        return ret;
    
    int iRecvLen;
    
    memset(&ev,0,sizeof(WEvent));

    sleep(1);

    iRecvLen=GetMsg(ev);
    if(iRecvLen<=0)
        return iRecvLen;
 
    if(ev.PtlId==PTL_SYSMGR)
    {
        if(ev.evCode==SYSMGR_IPC_DEREGISTER_ACK)
        {
            memcpy(&m_sDeregister,ev.msgPtr,sizeof(SDeregister));
            if(m_sDeregister.bFlag==0)
            {
                printf("Deregister to SYSMGR OK,state=%d\n",m_sDeregister.bFlag);
                ev.del();
                return m_sDeregister.bFlag;
            }
        }
    }
   
    ev.del();
    return PSG_ERR_NORMAL;
}

/////////////////////////////////////////////////////////////
//
//  val     --  time,1 mis
//  flag    --  0   only once
//              1   repeated
//  pre     --  0   1   sec
//              1   10  sec
//              2   10  ms
//  RETURN  --  0   succeed
//              -1  failed
//              
////////////////////////////////////////////////////////////
int CIPCClient::StartTimer(const WEvent &ev,int val,char flag,char pre)
{
    WEvent  evt;
    STimer  sstimer;
                
    memcpy(&(sstimer.ev),&ev,sizeof(WEvent));
    
    sstimer.ev.what=evTimer;
    sstimer.ev.PtlId=PTL_SYSMGR;
    sstimer.ev.dmid=0;
    sstimer.ev.smid=m_iRealID;
    sstimer.iTimeVal=val;
    sstimer.iTimeLeft=val;
    sstimer.cTimerFlag=flag;
    sstimer.cTimerPrecision=pre;
    sstimer.ev.msgPtr=NULL;
    sstimer.ev.msgLen=0;
    
    evt.what=evTimer;
    evt.PtlId=PTL_SYSMGR;
    evt.evCode=SYSMGR_IPC_STARTTIMER;
    evt.msgLen=sizeof(STimer);
    evt.msgPtr=new char[sizeof(STimer)];
    memcpy(evt.msgPtr,&sstimer,sizeof(STimer));

	int ret=SendMsg(evt);
	evt.del();
	
	return ret;
}

int CIPCClient::StopTimer(const WEvent &ev)
{
    WEvent  evt;
    STimer  sstimer;
                
    memcpy(&(sstimer.ev),&ev,sizeof(WEvent));
    
    sstimer.ev.what=evTimer;
    sstimer.ev.PtlId=PTL_SYSMGR;
    sstimer.ev.dmid=0;
    sstimer.ev.smid=m_iRealID;
    
    evt.what=evTimer;
    evt.PtlId=PTL_SYSMGR;
    evt.evCode=SYSMGR_IPC_STOPTIMER;
    evt.msgLen=sizeof(STimer);
    evt.msgPtr=new char[sizeof(STimer)];
    memcpy(evt.msgPtr,&sstimer,sizeof(STimer));

	int ret=SendMsg(evt);
	evt.del();
	
	return ret;
}

#ifdef __PSG_REDUNDANT
int CIPCClient::VerifyTimer(const WEvent& ev, int val, char flag, char pre) // Add 2005-01-10, by Wujianjin.
{
	WEvent  evt;
	STimer  sstimer;

	memcpy(&(sstimer.ev),&ev,sizeof(WEvent));

	sstimer.ev.what=evTimer;
	sstimer.ev.PtlId=PTL_SYSMGR;
	sstimer.ev.dmid=0;
	sstimer.ev.smid=m_iRealID;
	sstimer.iTimeVal=val;
	sstimer.iTimeLeft=val;
	sstimer.cTimerFlag=flag;
	sstimer.cTimerPrecision=pre;
	sstimer.ev.msgPtr=NULL;
	sstimer.ev.msgLen=0;

	evt.what=evTimer;
	evt.PtlId=PTL_SYSMGR;
	evt.evCode=SYSMGR_IPC_VERIFY_TIMER;
	evt.msgLen=sizeof(STimer);
	evt.msgPtr=new char[sizeof(STimer)];
	memcpy(evt.msgPtr, &sstimer, sizeof(STimer));

	int ret = SendMsg(evt);
	evt.del();

	return ret;
}
#endif // __PSG_REDUNDANT

int CIPCClient::SendMsg(const char *buf,UINT16 len)
{
	//static int cct=1;
	if (m_iRemoteMsgQueID==-1)
	{
		printf("Cannot locate IPC's message queue\n");
		return PSG_ERR_QUENOINIT;
	}

	int quebs,llen=0; 

	msqid_ds sqid;
	
	msgctl(m_iRemoteMsgQueID, IPC_STAT, &sqid);

	quebs=sqid.msg_qbytes;
	if ((quebs-sqid.msg_cbytes)<=len)
	{
		//printf("Queue is full max=%d curr=%d  len=%d %d\n",quebs,sqid.msg_cbytes,len,cct++);	
		return PSG_ERR_QUEFULL;
	}
	
	if ((llen=msgsnd(m_iRemoteMsgQueID,buf,len,0))<0)
	{
		//printf("Send message to queue failed in SendMsg(UINT8 *,UNIT16)\n");
		//perror("");
		return PSG_ERR_IPCNOEXIST;
	}

	return llen;
}

int CIPCClient::SendMsg(const WEvent &ev)//modify 2003-08-19
{
	if(m_iRemoteMsgQueID==-1)
	{
		printf("Cannot locate IPC's message queue\n");
		return PSG_ERR_QUENOINIT;
	}
    
	WEvent evt;
	
	memcpy(&evt,&ev,sizeof(WEvent));
	evt.smid=m_iRealID;
	
	char    *pcSendBuf;
	UINT16  iEventLen,iBufLen;

	iEventLen=sizeof(WEvent);
	iBufLen=ev.msgLen;
	if(iBufLen>=IPC_MAXMSG)
	{
		printf("send::Error in ev.msgLen=%d\n",iBufLen);
		return -1;
	}
 
	pcSendBuf=new char[iEventLen+iBufLen+sizeof(long int)];
	if(pcSendBuf==NULL)
	{
		printf("Cannot allocate memory in SendMsg(WEvent)\n");
		return PSG_ERR_NOMEM;
	}

	memset(pcSendBuf,0,sizeof(long int));
	pcSendBuf[0]=1;
	
	memcpy(pcSendBuf+sizeof(long int),&evt,iEventLen);
	if (ev.msgPtr && iBufLen>0)
       	memcpy(pcSendBuf+iEventLen+sizeof(long int),ev.msgPtr,iBufLen);
	else
		iBufLen=0;

	int len=0;
	len=SendMsg(pcSendBuf,iEventLen+iBufLen+sizeof(long int));
	
	delete pcSendBuf;	
	return len;
}

int CIPCClient::GetMsg(char *buf)
{
    if(m_iLocalMsgQueID==-1)
    {
        printf("Cannot locate local message queue\n");
        return PSG_ERR_QUENOINIT;
    }

    int iRecvLen;
    iRecvLen=msgrcv(m_iLocalMsgQueID,buf,IPC_MAXMSG,0,IPC_NOWAIT | MSG_NOERROR);
    if(iRecvLen<0)
    {
		if(errno==ENOMSG)
			return 0;
		else
        	return PSG_ERR_IPCNOEXIST;
    }            

    return iRecvLen;
}

int CIPCClient::GetMsg(WEvent &ev)
{
    char caReadBuf[IPC_MAXMSG];
    memset(caReadBuf,0,IPC_MAXMSG);

    int iRecvLen=0;

    iRecvLen=GetMsg(caReadBuf);
    if(iRecvLen<0)
        return -1;

    memset(&ev,0,sizeof(WEvent));

    if(iRecvLen==0)
    {
        return 0;
    }
    memcpy(&ev,caReadBuf+sizeof(long int),sizeof(WEvent));

    if(ev.what==0)
    {
    	//printf("Get message what==0\n");
		return 0;
	}

    if(ev.msgLen>0 && ev.msgLen<IPC_MAXMSG)
    {
        ev.msgPtr=new char[ev.msgLen];
        memcpy(ev.msgPtr,caReadBuf+sizeof(WEvent)+sizeof(long int),ev.msgLen);
    }

	////////////Add 2003-08-12
	else
	{
		ev.msgLen=0;
		ev.msgPtr=NULL;
	}
   ////////////Add 2003-08-12
   
    return iRecvLen;
}


int CIPCClient::Exit()
{
	Deregister();

	return(DelQue());
}

int CIPCClient::DelQue()
{
	if(m_iLocalMsgQueID==-1)
		return -1;
	printf("Delete Queid=%d\n",m_iLocalMsgQueID);
	if(msgctl(m_iLocalMsgQueID,IPC_RMID,NULL))
	{
		perror("");
		return -1;
	}
		
	m_iLocalMsgQueID=-1;

	return 0;
}

int CIPCClient::Wait()
{
	signal(SIGALRM, sig_alrm); // Set ALARM signal handler.

#ifndef __SETITIMER // Alarm() will conflict with setitimer().
	alarm(1); // After 1s wake me up.
#endif // __SETITIMER
	
	// printf("SYSMGR Pid=%d\n", m_sRegister.iSysmgrPid);
	// Check SYSMGR is alive.
	// Add 2005-01-05, by Wujianjin.

/* // Delete 2005-07-12, by Wujianjin.
	// Cause: The following code affect the accuracy of SYSMGR timing service.
#ifdef __PSG_REDUNDANT	
	if (kill(m_sRegister.iSysmgrPid, SIGALRM) < 0)
	{ // Analisis error value
		if (EINVAL == errno)
		{ // Ignore.
		}
		else if (ESRCH == errno)
		{ // SYSMGR not exist.
			fprintf(stderr, "!!!  SYSMGR out of service.\n");
			return -1;
		}
		else if (EPERM == errno)
		{ // SYSMGR is alive.
		}
	}
	else
	{ // SYSMGR is alive.
	}
#endif // __PSG_REDUNDANT
*/

	if (msgget(IPC_QUEUE_KEYID,0777 | IPC_EXCL) < 0)
		return PSG_ERR_IPCNOEXIST;

	pause();
	
	return 0;
}
// -----------------------------------------------------------------------------
//
//  Revision list.
//  ==============
//
//  1.0,        2003-05-13,     Lu Shengsheng
//      Initial version.
//
// ------------------------------------------------------------------------

⌨️ 快捷键说明

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