📄 sgipclientsocket.cpp
字号:
//当还有一些提交操作在等待结果时(而服务此时非正常结束),
//++还要做以下的清理工作,保存一些结果。
//1.通知各发送线程返回
//++2.记录这一情况
//通知各发送线程返回
#ifdef _DEBUG
CString strDebugMsg;
strDebugMsg.Format("CSgipClientSocket::OnClose(nErrorCode = %d)!\r\n",nErrorCode);
//TRACE("CSgipClientSocket::OnClose!\r\n");
TRACE(strDebugMsg);
#endif
int i;
for(i = 0 ;i < (BF_MAX_NUM_WAIT_SUBRESP); i++)
{
if(m_WRBuf[i].iStatus == 1)//being used
{
m_WRBuf[i].iStatus = 0;//free
m_WRBuf[i].iSubmitStatus = -3;//-3:连接已被关闭
SetEvent(m_WRBuf[i].hSubmit);
}
}
//一些变量复位
// m_bCreated = FALSE;
m_bConnected = FALSE;
m_bBinded = FALSE;
// m_iUsedChannels = 0;
ResetEvent(m_hClientConnect);
ResetEvent(m_hClientBind);
//......
// CAsyncSocket::Close();
// CAsyncSocket::Create();
//......
//
m_bError = TRUE;
CAsyncSocket::OnClose(nErrorCode);
CAsyncSocket::Detach();
}
void CSgipClientSocket::OnConnect(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
#ifdef _DEBUG
CString strDebugMsg;
strDebugMsg.Format("CSgipClientSocket::OnConnect(nErrorCode = %d)!\r\n",nErrorCode);
//TRACE("CSgipClientSocket::OnClose!\r\n");
TRACE(strDebugMsg);
#endif
if(0 == nErrorCode)
{
m_bConnected = TRUE;
}
SetEvent(m_hClientConnect);
CAsyncSocket::OnConnect(nErrorCode);
}
void CSgipClientSocket::OnBind_resp()
{
Receive(&m_Resp_def, sizeof(t_RESP_DEF));
if (m_Resp_def.Result == 0)
{
TRACE("BIDN TO SGIP OK!\n");
m_bBinded = TRUE;
SetEvent(m_hClientBind);
}
else
{
TRACE("BIDN TO SGIP FAIL!\n");
m_bBinded = FALSE;
SetEvent(m_hClientBind);
}
return;
}
void CSgipClientSocket::OnUnbind_resp()
{
TRACE("CSgipClientSocket::OnUnbind_resp!\n");
m_bBinded = FALSE;
}
void CSgipClientSocket::OnSubmit_resp()
{
//TRACE("OnSubmit_resp!\n");
Receive(&m_Resp_def, sizeof(t_RESP_DEF));
CString str;
int iSubmitResult;
if (m_Resp_def.Result == 0)//submit ok?
{//y
CString strSOC;
iSubmitResult = CSUB_STATUS_SUBMITOK;
}
else
{//n
#ifdef _DEBUG
CString strErrorCode;
TRACE("Submit to smg fail!ErrorCode:" + strErrorCode + "\n");
#endif
iSubmitResult = CSUB_STATUS_SUBMITFAIL;
}
unsigned long ulTimeID = GetTimeIDFromSequence();
unsigned long ulSgipSerial = GetCycleNoFromSequence();
unsigned long ulSourceID = GetSourceIDFromSequence();
/* m_pManager->m_ini_def.OnSMSSubmitResp(ulTimeID,
ulSgipSerial,
iSubmitResult);
*/
//++Check the ulSgipSerial id Ok?
//根据序列号(ulSgipSerial)得到相应的通道号?
//Y得到
//SetSubmitStatus && SetEvent
//++如果等待该SUBMIT结果的线程已经退出,
//++而这个DOWNCMDBUFFER又没清除,应该不会出问题的!???
//++(因为此时的通道使用状况应该是FREE的,
//++还没被其他等待SUBMIT结果的线程占用)!?
//N得不到
//记录下来!
/* int i;
BOOL bFound = FALSE;
for(i = 0 ;i < (BF_MAX_NUM_WAIT_SUBRESP); i++)
{
if(m_WRBuf[i].ulSgipSerialNo == ulSgipSerial)
{
bFound = TRUE;
break;
}
}
//以下的处理
if(bFound)
{
if(m_pManager->SetChannelSubmitStatus(ulSgipSerial,i,iSubmitResult))
{
TRACE("OnSubmitResp: SetChannelSubmitStatus ok\n");
}
else
{
TRACE("OnSubmitResp: SetChannelSubmitStatus fail\n");
}
}
else
{
TRACE("OnSubmitResp: can't find the channel match the sgipserialno\n");
}*/
}
void CSgipClientSocket::OnDeliver_resp()
{
//TRACE("OnSubmit_resp!\n");
Receive(&m_Resp_def, sizeof(t_RESP_DEF));
CString str;
int iSubmitResult;
if (m_Resp_def.Result == 0)//submit ok?
{//y
CString strSOC;
iSubmitResult = CDEL_STATUS_DELIVEROK;
}
else
{//n
#ifdef _DEBUG
CString strErrorCode;
TRACE("Submit to smg fail!ErrorCode:" + strErrorCode + "\n");
#endif
iSubmitResult = CDEL_STATUS_DELIVERFAIL;
}
unsigned long ulTimeID = GetTimeIDFromSequence();
unsigned long ulSgipSerial = GetCycleNoFromSequence();
unsigned long ulSourceID = GetSourceIDFromSequence();
//Check the ulSgipSerial id Ok?
//根据序列号(ulSgipSerial)得到相应的通道号?
//Y得到
//SetSubmitStatus && SetEvent
//++如果等待该SUBMIT结果的线程已经退出,
//++而这个DOWNCMDBUFFER又没清除,应该不会出问题的!???
//++(因为此时的通道使用状况应该是FREE的,
//++还没被其他等待SUBMIT结果的线程占用)!?
//N得不到
//记录下来!
int i;
BOOL bFound = FALSE;
for(i = 0 ;i < (BF_MAX_NUM_WAIT_SUBRESP); i++)
{
if(m_WRBuf[i].ulSgipSerialNo == ulSgipSerial)
{
SetEvent(m_WRBuf[i].hSubmit);
m_WRBuf[i].iSubmitStatus = iSubmitResult;
bFound = TRUE;
break;
}
}
#ifdef _DEBUG
//以下的处理
if(bFound)
{
//TRACE("OnSubmitResp: find the channel match the sgipserialno\n");
/*if(m_pManager->SetChannelSubmitStatus(ulSgipSerial,i,iSubmitResult))
{
TRACE("OnSubmitResp: SetChannelSubmitStatus ok\n");
}
else
{
TRACE("OnSubmitResp: SetChannelSubmitStatus fail\n");
}*/
}
else
{
//TRACE("OnSubmitResp: can't find the channel match the sgipserialno\n");
}
#endif
}
void CSgipClientSocket::SetError(BOOL bError)
{
m_bError = bError;
}
BOOL CSgipClientSocket::HaveError()
{
return m_bError;
}
/*BOOL CSgipClientSocket::IsCreated()
{
return m_bCreated;
}*/
//////////////////////////////////////////////
//check if this connection is connected?
/////////////////////////////////////////////
BOOL CSgipClientSocket::IsConnected()
{
return m_bConnected;
}
//////////////////////////////////////////////
//check if this connection is Binded?
/////////////////////////////////////////////
BOOL CSgipClientSocket::IsBinded()
{
return m_bBinded;
}
//////////////////////////////////////////////////////
//function:get one free channel No.
//retval: -1 no free channel
////////////////////////////////////////////////////
int CSgipClientSocket::GetChannel()
{
int iChannelNo = -1;
int i;
//all are used?
if(m_iUsedChannels > BF_MAX_NUM_WAIT_SUBRESP)
{
iChannelNo = -1;
return iChannelNo;
}
for(i = 0 ;i < (BF_MAX_NUM_WAIT_SUBRESP); i++)
{
if(m_WRBuf[i].iStatus == 0)
{
iChannelNo = i;
break;
}
}
//此时iChannelNo肯定不是-1的,不然就是发生了错误!
ASSERT( iChannelNo != -1);
//increase the channel num
m_iUsedChannels++;
return iChannelNo;
}
int CSgipClientSocket::GetUsedChannels()
{
return m_iUsedChannels;
}
///////////////////////////////////////////////
//free channel
//retval:true:ok
// false:发生了不匹配的情况
BOOL CSgipClientSocket::FreeChannel(int iChannelNo,unsigned long ulSgipSerialNo)
{
//++must check the iChannelNo!!!!
if(m_WRBuf[iChannelNo].ulSgipSerialNo == ulSgipSerialNo)
{
m_WRBuf[iChannelNo].iStatus = 0;
m_WRBuf[iChannelNo].ulSgipSerialNo = -1;
ResetEvent(m_WRBuf[iChannelNo].hSubmit);
m_WRBuf[iChannelNo].iSubmitStatus = 0;
//decrease the channel num
m_iUsedChannels--;
return TRUE;
}
return FALSE;
}
BOOL CSgipClientSocket::SetChannelSerialNo(int iChannelNo, unsigned long ulSgipSerialNo)
{
m_WRBuf[iChannelNo].ulSgipSerialNo = ulSgipSerialNo;
return TRUE;
}
BOOL CSgipClientSocket::SetChannelCmdBufNo(int iChannelNo, int iCmdBufNo)
{
m_WRBuf[iChannelNo].iCmdBufNo = iCmdBufNo;
return TRUE;
}
BOOL CSgipClientSocket::SetChannelStatus(int iChannelNo, int iStatus)
{
m_WRBuf[iChannelNo].iStatus = iStatus;
return TRUE;
}
BOOL CSgipClientSocket::SetChannelSubmitStatus(int iChannelNo, int iSubmitStatus)
{
m_WRBuf[iChannelNo].iSubmitStatus = iSubmitStatus;
return TRUE;
}
BOOL CSgipClientSocket::ResetChannelSubmitEvent(int iChannelNo)
{
ResetEvent(m_WRBuf[iChannelNo].hSubmit);
return TRUE;
}
HANDLE* CSgipClientSocket::GethSubmit(int iChannelNo)
{
return &m_WRBuf[iChannelNo].hSubmit;
}
int CSgipClientSocket::GetChannelSubmitStatus(int iChannelNo)
{
return m_WRBuf[iChannelNo].iSubmitStatus;
}
unsigned long CSgipClientSocket::GetChannelSerialNo(int iChannelNo)
{
return m_WRBuf[iChannelNo].ulSgipSerialNo;
}
BOOL CSgipClientSocket::SetSocketNo(int iSocketNo)
{
m_iSocketNo = iSocketNo;
return TRUE;
}
int CSgipClientSocket::GetSocketNo()
{
return m_iSocketNo;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -