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

📄 sgipclientsocket.cpp

📁 1、自己编写的遵循SGIP1.1的短信网关模拟程序。仅供测试、学习。 2、该程序只实现了SGIP1.1协议的一部分。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//当还有一些提交操作在等待结果时(而服务此时非正常结束),
	//++还要做以下的清理工作,保存一些结果。
		//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 + -