📄 ipcclnt.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 + -