📄 _emspreceivor.cpp
字号:
#include "stdafx.h"
#include ".\_emspreceivor.h"
#include "net_protocal.h"
#include "_MSG_Head.h"
#include "_MBREPORT.h"
#include "_DELIVER.h"
#include "_S_REPORT_RESP.h"
#include ".\revthread.h"
#include "EMSP_ERROR.h"
#include "_MBLOGIN_RESP.h"
#include"_MBNOOP.h"
#include "EMSP_ERROR.h"
#include "_MBNOOP_RESP.h"
#include <typeinfo.h>
#include <windows.h>//Use system resorce lock
using namespace EMSP2_0;
EMSP2_0::C_EMSPReceivor::C_EMSPReceivor(void)
: done(false)
, internal(500)
{
RevThread* rthread=new RevThread();
rthread->recvor=this;
m_thread=rthread;
}
EMSP2_0::C_EMSPReceivor::~C_EMSPReceivor(void)
{ done=false;
delete m_thread;
}
MB_REPORT* EMSP2_0::C_EMSPReceivor::GetReport(void)
{MB_REPORT* value=NULL;
if(v_Report.size()>0)
{
value=&v_Report[v_Report.size()-1];
v_Report.pop_back();
}
return value;
}
MB_DELIVER* EMSP2_0::C_EMSPReceivor::Get_DELIVER(void)
{ MB_DELIVER* value=NULL;
if(v_Deliver.size()>0)
{
value= & v_Deliver[v_Deliver.size()-1];
v_Deliver.pop_back();
}
return value;
}
void EMSP2_0::C_EMSPReceivor::start(void)
{ done=true;
m_thread->start();
}
void EMSP2_0::C_EMSPReceivor::stop(void)
{
done=false;
}
void EMSP2_0::C_EMSPReceivor::run(void)
{
while (done) {
MsgHead mh=GetMsgHead();
int size=mh.Total_length-13;
switch(mh.Command_ID) {
case S_DELIVER:
{ GetDeliver(size);
break;
}
case S_REPORT :
{ get_Report(size);
break;
}
}
Sleep(internal);
}
}
MsgHead EMSP2_0::C_EMSPReceivor::GetMsgHead(void)
{
char buff[13];
if(ReceiveBuf((void*)buff,13)>0)
{
C_MSG_Head msgObj;
msgObj.TransFromchars(buff,13);
return * msgObj.value();
}else
return MsgHead();
}
void EMSP2_0::C_EMSPReceivor::get_Report(int size)
{
char mb;
MsgHead mh;
FillHead(&mh,S_REPORT_RESP);
mh.Total_length=14;
char* buff=new char[size];
if(ReceiveBuf((void*)buff,size))
{
C_MBREPORT mbr;
mbr.TransFromchars(buff,size);
delete[] buff;
//v_Report.push_back(*mbr.value());
char s[500];
sprintf(s," Report:\nClientSeq1=%d \n ClientSeq2=%d \n UserNumber=%s \n State=%d \n ErrCode=%d \n Report End\n"
,mbr.value()->ClientSeq1, mbr.value()->ClientSeq2,mbr.value()->UserNumber.c_str(),
mbr.value()->State,mbr.value()->ErrCode);
writeRevlog(s);
mb=0;
}
else
{
mb=1;
}
C_MSG_Head mhobj(mh);
char* hbuff =mhobj.getBytes();
SendBuff((void*)hbuff,13);
SendBuff((void*)mb,1);
lastActive=time(NULL);
delete[] buff;
}
void EMSP2_0::C_EMSPReceivor::GetDeliver(int size)
{ char mb;
MsgHead mh;
FillHead(&mh,S_DELIVER_RESP);
mh.Total_length=14;
char* buff=new char[size];
if(ReceiveBuf((void*)buff,size))
{
C_DELIVER mbr;
mbr.TransFromchars(buff,size);
delete[] buff;
v_Deliver.push_back(*mbr.value());
mb=0;
}
else
{
mb=1;
}
C_MSG_Head mhobj(mh);
char* hbuff =mhobj.getBytes();
SendBuff((void*)hbuff,13);
SendBuff((void*)mb,1);
lastActive=time(NULL);
delete[] buff;
}
bool EMSP2_0::C_EMSPReceivor::Get_DELIVER(MB_DELIVER* md)
{ char mb;
MsgHead mh1=GetMsgHead();
int size=mh1.Total_length-13;
switch(mh1.Command_ID){
case S_DELIVER:
{
bool flag=false;
MsgHead mh;
FillHead(&mh,S_DELIVER_RESP);
mh.Total_length=14;
char* buff=new char[size];
if(ReceiveBuf((void*)buff,size))
{
C_DELIVER mbr;
mbr.TransFromchars(buff,size);
delete[] buff;
flag=true;
md->Caller=mbr.value()->Caller;
md->Called=mbr.value()->Called;
md->TP_pid=mbr.value()->TP_pid;
md->TP_udhi=mbr.value()->TP_udhi;
md->MsgCoding=mbr.value()->MsgCoding;
md->MsgLen=mbr.value()->MsgLen;
memcpy(md->MsgContent,mbr.value()->MsgContent,160);
mb=0;
}
else
{
mb=1;
delete[] buff;
flag=false;
}
C_MSG_Head mhobj(mh);
char* hbuff =mhobj.getBytes();
SendBuff((void*)hbuff,13);
SendBuff((void*)&mb,1);
lastActive=time(NULL);
return flag;
}
case C_NOOP_RESP:
{
char* buff=new char[size];
ReceiveBuf((void*)buff,size);
m_SessionID=buff;
delete[] buff;
}
case S_REPORT:
{
get_Report(size);
break;
}
default:
{
//Keep Connection
time_t t =time(NULL);
if ((t-lastActive)>10)
{
MsgHead mh;
FillHead(&mh,C_NOOP);
MB_NOOP mb;
mb.SessionID=m_SessionID;
C_MBNOOP mbobj(mb);
int size=mb.SessionID.size()+1;
mh.Total_length=size+13;
C_MSG_Head mhObj(mh);
char* mhBuf=mhObj.getBytes();
char* mbBuf=mbobj.getByttes();
SendBuff((void*)mhBuf,13);
SendBuff((void*)mbBuf,size);
/*char buff[13];
if(ReceiveBuf(buff,13))
{
mhObj.TransFromchars(buff,13);
int rsize=mhObj.value()->Total_length-13;
char * rbuff=new char[rsize];
if(ReceiveBuf((void*)rbuff,rsize))
{ C_MBNOOP_RESP mrb;
mrb.TransFromchars(rbuff,rsize);
if(mrb.value()->Result==0) //Keep Connection OK
{
m_SessionID=mrb.value()->SessionID;
lastActive=time(NULL);
string s=typeid(*this).name();
s=s+ ctime(&lastActive);
s=s+":"+"Keep Connection OK ";
writelog(s.c_str());
}
else
{
theSock->ReConnect();
Login();
EMSP2_0::ShowError(mrb.value()->Result);
}
}
else
{
theSock->ReConnect();
Login();
}
delete[] rbuff;
} else
{
theSock->ReConnect();
Login();
} */
}
}
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -