351 lines
8.1 KiB
C++
351 lines
8.1 KiB
C++
// THNetRegClient.cpp: implementation of the CTHNetRegMsgRecv class.
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "compat_mfc.h"
|
|
#include "compat_socket.h"
|
|
#include "THNetRegClient.h"
|
|
//////////////////////////////////////////////////////////////////////
|
|
// Construction/Destruction
|
|
//////////////////////////////////////////////////////////////////////
|
|
CTHNetRegMsgSend::CTHNetRegMsgSend()
|
|
{
|
|
m_nRegID = 0;
|
|
m_szRegName[0] = 0;
|
|
}
|
|
CTHNetRegMsgSend::CTHNetRegMsgSend(const char * szRegName)
|
|
{
|
|
m_nRegID = 0;
|
|
if(szRegName == NULL)
|
|
{
|
|
m_szRegName[0] = 0;
|
|
}
|
|
else
|
|
{
|
|
strcpy(m_szRegName,szRegName);
|
|
}
|
|
}
|
|
|
|
CTHNetRegMsgSend::CTHNetRegMsgSend(const int nRegID)
|
|
{
|
|
m_nRegID = nRegID;
|
|
m_szRegName[0] = 0;
|
|
}
|
|
CTHNetRegMsgSend::~CTHNetRegMsgSend()
|
|
{
|
|
m_oLink.Close();
|
|
}
|
|
void CTHNetRegMsgSend::SetRegName(const char * szRegName,const int nSubID)
|
|
{
|
|
strcpy(m_szRegName,szRegName);
|
|
m_nRegID = 0;
|
|
m_nSubID = nSubID;
|
|
}
|
|
void CTHNetRegMsgSend::SetRegID(const int nRegID,const int nSubID)
|
|
{
|
|
m_nRegID = nRegID;
|
|
m_nSubID = nSubID;
|
|
m_szRegName[0] = 0;
|
|
}
|
|
int CTHNetRegMsgSend::LinkTo(const char * szHost,int nPort)
|
|
{
|
|
m_oLink.m_oServPara.SetHostName(szHost,nPort);
|
|
return m_oLink.LinkTo(szHost,nPort);
|
|
}
|
|
int CTHNetRegMsgSend::LinkToSrv(const char * szSrvName,int nAppNo,int nCtxNo)
|
|
{
|
|
m_oLink.m_oServPara.SetServName(szSrvName,nAppNo,nCtxNo);
|
|
return m_oLink.LinkToSrv(szSrvName,nAppNo,nCtxNo);
|
|
}
|
|
int CTHNetRegMsgSend::LinkToSrv(const char * szSrvName,const char * szApp,const char * szCtx)
|
|
{
|
|
m_oLink.m_oServPara.SetServName(szSrvName,szApp,szCtx);
|
|
return m_oLink.LinkToSrv(szSrvName,szApp,szCtx);
|
|
}
|
|
void CTHNetRegMsgSend::SetServName(const char * szSrvName,const int nAppNo,const int nCtxNo)
|
|
{
|
|
m_oLink.m_oServPara.SetServName(szSrvName,nAppNo,nCtxNo);
|
|
}
|
|
void CTHNetRegMsgSend::SetServName(const char * szSrvName,const char * szApp,const char * szCtx)
|
|
{
|
|
m_oLink.m_oServPara.SetServName(szSrvName,szApp,szCtx);
|
|
}
|
|
void CTHNetRegMsgSend::SetGetHostNameCallBackByAppID(GETHOSTBYSRV_CALLBACK pCmd)
|
|
{
|
|
m_oCallbackWithAppID = pCmd;
|
|
m_oLink.SetGetHostNameCallBackByAppID(m_oCallbackWithAppID);
|
|
}
|
|
void CTHNetRegMsgSend::SetGetHostNameCallBackByAppName(GETHOSTBYSRV_CALLBACK_BYNAME pCmd)
|
|
{
|
|
m_oCallbackWithAppName = pCmd;
|
|
m_oLink.SetGetHostNameCallBackByAppName(m_oCallbackWithAppName);
|
|
}
|
|
int CTHNetRegMsgSend::SendRegMsg(CNetCmdCommCmdValue * pValue,const char * szHost)
|
|
{
|
|
XByteArray ba(1024 * 1024);
|
|
/*
|
|
if(m_szRegName[0] != 0)
|
|
{
|
|
ba.WriteString(m_szRegName);
|
|
}
|
|
*/
|
|
pValue->Write(&ba);
|
|
NET_HEAD oHead;
|
|
memset(&oHead,0,sizeof(NET_HEAD));
|
|
if(m_szRegName[0] != 0)
|
|
{
|
|
oHead.cmdtype = 0;
|
|
oHead.src.reg_id = 0;
|
|
strcpy(oHead.src.regname,m_szRegName);
|
|
oHead.userdata1 = m_nSubID;
|
|
oHead.userdata2 = 0;
|
|
}
|
|
else
|
|
{
|
|
// oHead.cmdtype = m_nRegID;
|
|
oHead.src.reg_id = m_nRegID;
|
|
oHead.src.regname[0]= 0;
|
|
oHead.cmdtype = m_nRegID;
|
|
oHead.userdata1 = m_nSubID;
|
|
oHead.userdata2 = 0;
|
|
}
|
|
oHead.src.n_reg_type = 2;
|
|
// oHead.userdata1 = 2;
|
|
oHead.len = ba.m_nLength;
|
|
|
|
bool beSucc = m_oLink.IsWritable();
|
|
if(!beSucc || !m_bSendSucc)
|
|
{
|
|
beSucc = m_oLink.LinkByPara(m_oLink.m_oServPara);
|
|
}
|
|
|
|
m_bSendSucc = beSucc;
|
|
if(beSucc)
|
|
{
|
|
m_bSendSucc = m_oLink.TxStream(&oHead,ba.m_pData);
|
|
}
|
|
return m_bSendSucc;
|
|
}
|
|
void CTHNetRegMsgSend::SetHostName(const char * szHost,int nPort)
|
|
{
|
|
m_oLink.m_oServPara.SetHostName(szHost,nPort);
|
|
}
|
|
|
|
CTHNetRegMsgRecv::CTHNetRegMsgRecv()
|
|
{
|
|
m_pStream = NULL;
|
|
m_pStreamWithName = NULL;
|
|
m_oCallbackWithAppName = NULL;
|
|
m_oCallbackWithAppID = NULL;
|
|
m_oDataList.RemoveAll();
|
|
}
|
|
CTHNetRegMsgRecv::~CTHNetRegMsgRecv()
|
|
{
|
|
if(m_pStream != NULL)
|
|
{
|
|
delete m_pStream;
|
|
}
|
|
if(m_pStreamWithName != NULL)
|
|
{
|
|
delete m_pStreamWithName;
|
|
}
|
|
POSITION pos = m_oDataList.GetHeadPosition();
|
|
while (pos != NULL)
|
|
{
|
|
XByteArray * pa = (XByteArray * )m_oDataList.GetNext(pos);
|
|
delete pa;
|
|
}
|
|
m_oDataList.RemoveAll();
|
|
}
|
|
void CTHNetRegMsgRecv::SetServName(const char * szSrvName,const int nAppNo,const int nCtxNo)
|
|
{
|
|
m_oLink.m_oServPara.SetServName(szSrvName,nAppNo,nCtxNo);
|
|
}
|
|
void CTHNetRegMsgRecv::SetServName(const char * szSrvName,const char * szApp,const char * szCtx)
|
|
{
|
|
m_oLink.m_oServPara.SetServName(szSrvName,szApp,szCtx);
|
|
}
|
|
void CTHNetRegMsgRecv::SetRegName(const char * szRegName,const int nSubID)
|
|
{
|
|
strcpy(m_szRegName,szRegName);
|
|
m_nRegID = 0;
|
|
m_nSubID = nSubID;
|
|
}
|
|
void CTHNetRegMsgRecv::SetRegID(const int nRegID,const int nSubID)
|
|
{
|
|
m_nRegID = nRegID;
|
|
m_nSubID = nSubID;
|
|
m_szRegName[0] = 0;
|
|
}
|
|
void CTHNetRegMsgRecv::SetGetHostNameCallBackByAppID(GETHOSTBYSRV_CALLBACK pCmd)
|
|
{
|
|
m_oCallbackWithAppID = pCmd;
|
|
}
|
|
void CTHNetRegMsgRecv::SetGetHostNameCallBackByAppName(GETHOSTBYSRV_CALLBACK_BYNAME pCmd)
|
|
{
|
|
m_oCallbackWithAppName = pCmd;
|
|
}
|
|
bool StreamFuncWithName(void* pParam1, void* pParam2, void* pParam3)
|
|
{
|
|
RegStreamWithName* pStream = (RegStreamWithName*)pParam1;
|
|
CTHNetRegMsgRecv * pClient = (CTHNetRegMsgRecv *)pStream->GetParent();
|
|
if(pClient == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
NET_HEAD* pHead =(NET_HEAD*)pParam2;
|
|
if(strcmp(pStream->GetRegType()->cmdtypename,pClient->m_szRegName))
|
|
{
|
|
return false;
|
|
}
|
|
// printf("get new mess !\n");
|
|
if(pClient->m_nSubID > 0)
|
|
{
|
|
if(pHead->userdata1 != pClient->m_nSubID)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
XByteArray* pa = new XByteArray(pHead->len);
|
|
pa->WriteData((BYTE*)pParam3, pHead->len);
|
|
pClient->WriteMess(pa);
|
|
return true;
|
|
}
|
|
bool StreamFunc(void* pParam1, void* pParam2, void* pParam3)
|
|
{
|
|
RegStream* pStream = (RegStream*)pParam1;
|
|
CTHNetRegMsgRecv * pClient = (CTHNetRegMsgRecv *)pStream->GetParent();
|
|
if(pClient == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
NET_HEAD* pHead =(NET_HEAD*)pParam2;
|
|
if(pStream->GetRegType()->cmdtype != pClient->m_nRegID)
|
|
{
|
|
return false;
|
|
}
|
|
// printf("get new mess !\n");
|
|
if(pClient->m_nSubID > 0)
|
|
{
|
|
if(pHead->userdata1 != pClient->m_nSubID)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
XByteArray* pa = new XByteArray(pHead->len);
|
|
pa->WriteData((BYTE*)pParam3, pHead->len);
|
|
pClient->WriteMess(pa);
|
|
return true;
|
|
}
|
|
BOOL CTHNetRegMsgRecv::RegistWithName()
|
|
{
|
|
if(m_pStreamWithName != NULL)
|
|
{
|
|
delete m_pStreamWithName;
|
|
m_pStreamWithName = NULL;
|
|
}
|
|
if(m_pStream)
|
|
{
|
|
delete m_pStream;
|
|
m_pStream = NULL;
|
|
}
|
|
if(m_szRegName[0] == 0)
|
|
{
|
|
if(m_nRegID > 0)
|
|
{
|
|
return Regist();
|
|
}
|
|
return FALSE;
|
|
}
|
|
reg_type_withname regtype;
|
|
regtype.cmdtype = 0;
|
|
regtype.userdata1 = m_nSubID;
|
|
regtype.userdata2 = 1;
|
|
strcpy(regtype.cmdtypename,m_szRegName);
|
|
m_pStreamWithName = new RegStreamWithName(regtype,this);
|
|
memcpy(&(m_pStreamWithName->m_oServPara),&(m_oLink.m_oServPara),sizeof(CTHServPara));
|
|
|
|
m_pStreamWithName->SetProcFunc(StreamFuncWithName);
|
|
m_pStreamWithName->SetGetHostNameCallBackByAppID(m_oCallbackWithAppID);
|
|
m_pStreamWithName->SetGetHostNameCallBackByAppName(m_oCallbackWithAppName);
|
|
m_pStreamWithName->MakeStream();
|
|
|
|
return TRUE;
|
|
}
|
|
BOOL CTHNetRegMsgRecv::Regist()
|
|
{
|
|
if(m_pStream)
|
|
{
|
|
delete m_pStream;
|
|
m_pStream = NULL;
|
|
}
|
|
if(m_pStreamWithName != NULL)
|
|
{
|
|
delete m_pStreamWithName;
|
|
m_pStreamWithName = NULL;
|
|
}
|
|
if(m_nRegID <= 0)
|
|
{
|
|
if(m_szRegName[0] != 0)
|
|
{
|
|
return RegistWithName();
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
reg_type regtype;
|
|
regtype.cmdtype = m_nRegID;
|
|
regtype.userdata1 = m_nSubID;
|
|
regtype.userdata2 = 1;
|
|
m_pStream = new RegStream(regtype,this);
|
|
|
|
memcpy(&(m_pStream->m_oServPara),&(m_oLink.m_oServPara),sizeof(CTHServPara));
|
|
|
|
m_pStream->SetProcFunc(StreamFunc);
|
|
m_pStream->SetGetHostNameCallBackByAppID(m_oCallbackWithAppID);
|
|
m_pStream->SetGetHostNameCallBackByAppName(m_oCallbackWithAppName);
|
|
m_pStream->MakeStream();
|
|
return TRUE;
|
|
}
|
|
XByteArray * CTHNetRegMsgRecv::ReadMess()
|
|
{
|
|
if(m_oDataList.GetCount() == 0)
|
|
{
|
|
return NULL;
|
|
}
|
|
XByteArray * pa = (XByteArray * )m_oDataList.GetHead();
|
|
m_oDataList.RemoveHead();
|
|
return pa;
|
|
}
|
|
void CTHNetRegMsgRecv::WriteMess(XByteArray * pa)
|
|
{
|
|
// printf("new mess %d !!!\n",m_oDataList.GetCount());
|
|
m_oDataList.AddTail(pa);
|
|
}
|
|
void CTHNetRegMsgRecv::SetHostName(const char * szHost,int nPort)
|
|
{
|
|
m_oLink.m_oServPara.SetHostName(szHost,nPort);
|
|
}
|
|
int CTHNetRegMsgRecv::RecvMess(CNetCmdCommCmdValue * pValue,int nSleepTime) //ÒÔºÁÃëΪµ¥Î»...
|
|
{
|
|
int nTestTimes = nSleepTime / 50 + 1;
|
|
while (1)
|
|
{
|
|
XByteArray * pa = ReadMess();
|
|
if(pa == NULL)
|
|
{
|
|
nSleepTime -= 100;
|
|
if(nSleepTime <= 0)
|
|
{
|
|
return -1;
|
|
}
|
|
Sleep(50);
|
|
continue;
|
|
}
|
|
pValue->Read(pa);
|
|
delete pa;
|
|
break;
|
|
}
|
|
return 1;
|
|
}
|