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

📄 socketresource.cpp

📁 1、自己编写的遵循SGIP1.1协议的短信客户端程序。仅供测试、学习。 2、该程序只实现了SGIP1.1协议的一部分。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{//lock ok so must unlock it before return!!!!
		ASSERT(NULL != m_ClientSocket[iSocketNo].pClientSocket);
		bRet = m_ClientSocket[iSocketNo].pClientSocket->SetChannelStatus(iChannelNo,iStatus);
		singleLock.Unlock();
	}
	return bRet;	
}

BOOL CSocketResource::SetChannelSubmitStatus(unsigned long ulSgipSerial, int iChannelNo, int iSubmitStatus)
{
	CSingleLock singleLock(&m_CritSectionClient);
	BOOL bRet = FALSE;
	//wait until critsection unlock!
	if(singleLock.Lock()&&singleLock.IsLocked())
	{//lock ok so must unlock it before return!!!!
		for(int i = 0; i < CR_MAX_CLIENT_NUM; i++)
		{
			if(NULL == m_ClientSocket[i].pClientSocket) continue;
			if(m_ClientSocket[i].pClientSocket->GetChannelSerialNo(iChannelNo) == ulSgipSerial)
			{
				m_ClientSocket[i].pClientSocket->SetChannelSubmitStatus(iChannelNo,iSubmitStatus);
				SetEvent(*(m_ClientSocket[i].pClientSocket->GethSubmit(iChannelNo)));
				bRet = TRUE;
				break;
			}
		}
		singleLock.Unlock();
	}
	return bRet;
}

//////////////////////////////////////////////////////////////////////
//function:get can used serversocket
//retval: 0 :ok; -1 :error
//////////////////////////////////////////////////////////////
int CSocketResource::GetServerSocket(int *piSocketNo, CSgipServerSocket **ppServerSocket)
{
	CSingleLock singleLock(&m_CritSectionServer);
	int iRet = -1;
	if(singleLock.Lock()&&singleLock.IsLocked())
	{//lock ok so must unlock it before return!!!!
		for(int i = 0; i < CR_MAX_SERVER_NUM; i++)
		{
			if(NULL != m_ServerSocket[i].pServerSocket)
			{
				//if(m_ServerSocket[i].iStatus == 0)
				if(m_ServerSocket[i].pServerSocket->GetStatus() == 0)
				{
					m_ServerSocket[i].pServerSocket->Close();
					delete m_ServerSocket[i].pServerSocket;
					m_ServerSocket[i].pServerSocket = NULL;

					m_ServerSocket[i].pServerSocket = new CSgipServerSocket;
					m_ServerSocket[i].pServerSocket->SetManager(this);
					m_ServerSocket[i].pServerSocket->SetSocketNo(i);
					m_ServerSocket[i].pServerSocket->SetStatus(1);
					*ppServerSocket = m_ServerSocket[i].pServerSocket;
					*piSocketNo = i;
					m_ServerSocket[i].iStatus = 1;
					iRet = 0;
					break;
				}
				else
					continue;
			}

			m_ServerSocket[i].pServerSocket = new CSgipServerSocket;
			m_ServerSocket[i].pServerSocket->SetManager(this);
			m_ServerSocket[i].pServerSocket->SetSocketNo(i);
			m_ServerSocket[i].pServerSocket->SetStatus(1);
			*ppServerSocket = m_ServerSocket[i].pServerSocket;
			*piSocketNo = i;
			m_ServerSocket[i].iStatus = 1;
			iRet = 0;
			break;
		}
		singleLock.Unlock();
		//if(	-1 == iRet)
		//{//all connection are used!
		 //close some server socket which has been free for a priod of time,
		 //Check();
		//}
	}
	return iRet;
}

BOOL CSocketResource::SetServerSocketStatus(int iSocketNo, int iStatus)
{
	CSingleLock singleLock(&m_CritSectionServer);
	BOOL iRet = FALSE;
	if(singleLock.Lock()&&singleLock.IsLocked())
	{//lock ok so must unlock it before return!!!!
		m_ServerSocket[iSocketNo].iStatus = iStatus;
		if(m_ServerSocket[iSocketNo].pServerSocket != NULL)
		{
			m_ServerSocket[iSocketNo].pServerSocket->SetStatus(iStatus);
		}
		singleLock.Unlock();
	}
	return iRet;
}

void CSocketResource::Check()
{
	CSingleLock singleLock(&m_CritSectionServer);
	if(singleLock.Lock()&&singleLock.IsLocked())
	{//lock ok so must unlock it before return!!!!
		int i;
		for(i = 0; i < CR_MAX_SERVER_NUM; i++)
		{
			if(1 == m_ServerSocket[i].iStatus)
			{
				if(NULL != m_ServerSocket[i].pServerSocket)
				{
					CTimeSpan tms(0,0,CR_MAX_SERVER_WAITTIME,0);
					if(m_ServerSocket[i].pServerSocket->m_tmLastBusyTime + tms < CTime::GetCurrentTime())
					{
						m_ServerSocket[i].pServerSocket->Close();
						delete m_ServerSocket[i].pServerSocket;
						m_ServerSocket[i].pServerSocket = NULL;
						//m_ServerSocket[i].iStatus = 0;
					}
				}
			}
			/*else// == 0
			{
				if(NULL != m_ServerSocket[i].pServerSocket)
				{
					m_ServerSocket[i].pServerSocket->Close();
					delete m_ServerSocket[i].pServerSocket;
					m_ServerSocket[i].pServerSocket = NULL;
					//m_ServerSocket[i].iStatus = 0;
				}
			}*/
		}
		singleLock.Unlock();
	}		
}


/////////////////////////////////////////////////////////
//function:deliver one msg
//retval: 0: ok
//        -1: deliver error
//        -2: no connections
//        -3: 网络连接错误
//        -4:time out
//        -100:other error
/////////////////////////////////////////////////////
int CSocketResource::DeliverOneMsg(CString strUserNum, CString strContent, unsigned long ulSgipSerialNo, int iMsgCoding, BOOL bWaitResp)
{
	//GET CAN USED SGIP CLIENT CONNECTION
	BOOL bHGCSocket = FALSE;
	int iGCRet;//get client socket return
	int iSocketNo;
	CSgipClientSocket * pClientSocket;
	int iChannelNo;
	int iBufNo = 0;
	CString strSgipSerialNo;
	strSgipSerialNo.Format("%d",ulSgipSerialNo);
//	TRACE("SubmitOneMsg: ulSgipSerialNo is :"+strSgipSerialNo+"\n");
	iGCRet = GetClientSocket(&iSocketNo,&pClientSocket,&iChannelNo,ulSgipSerialNo,iBufNo);
	switch(iGCRet)
	{
	case 0://= 0  还未用到最后一个连接
		bHGCSocket = TRUE;
		break;
	case 1://= 1  已用到最后一个连接
		bHGCSocket = TRUE;
		break;
	case -1://= -1 无可用连接
		bHGCSocket = FALSE;
		TRACE("MonBufThread Send One Cmd fail!No Connection!\n");
		return -2;
		break;
	case -2://= -2 网络连接错误
		bHGCSocket = FALSE;
		TRACE("MonBufThread Send One Cmd fail!网络连接错误!\n");
		return -3;
		break;
	case -100://= -100 undefined error!!!
		bHGCSocket = FALSE;
	default:
		bHGCSocket = FALSE;
		return -100;
		TRACE("MonBufThread Send One Cmd fail!other error!\n");
		break;
	}

	if(bHGCSocket == TRUE)//HAVE GOT CLIENT SOCKET?
	{//Y
		int iSubmitRet;
		////////////////////
		unsigned long ulSgipSerialTime = SetSgipSerialTime();

		iSubmitRet = pClientSocket->DeliverPDU(ulSgipSerialNo,ulSgipSerialTime,
							strUserNum,strContent,iMsgCoding);

		if(iSubmitRet >= 0 && bWaitResp)
		{
			HANDLE *hSubmit = pClientSocket->GethSubmit(iChannelNo);
			DWORD dwWaitResult = WaitForSingleObject(*hSubmit, 2 * 1000);
			int   iLastError;
			switch(dwWaitResult)
			{
			case WAIT_ABANDONED:
				TRACE("WaitForSingleObject:WAIT_ABANDONED!\r\n");
				break;
			case WAIT_OBJECT_0:
				//TRACE("WaitForSingleObject:WAIT_OBJECT_0!\r\n");
				break;
			case WAIT_TIMEOUT:
				TRACE("WaitForSingleObject:WAIT_TIMEOUT!\r\n");
				break;
			case WAIT_FAILED:
				TRACE("WaitForSingleObject:WAIT_FAILED!\r\n");
				iLastError = GetLastError();
				break;
			}

			if(dwWaitResult == WAIT_OBJECT_0)
			{
				int iSubStatus = pClientSocket->GetChannelSubmitStatus(iChannelNo);
				switch(iSubStatus)
				{
				case CDEL_STATUS_NODELIVER://not submit
					//???如果到这里那就出错了!!!!
					TRACE("SendCmdThread:掉到陷阱里面去了!\r\n");
					break;
				case CDEL_STATUS_DELIVEROK://submit ok
					iSubmitRet = 0;
					//TRACE("SendCmdThread:submit ok!\r\n");
					break;
				case CDEL_STATUS_DELIVERFAIL://submit fail
					iSubmitRet = -1;
					TRACE("SendCmdThread:submit fail!\r\n");
					break;
				case CDEL_STATUS_DELIVERTIMEOUT://submit timeout(submit线程使用:好象都没什么用??(看下面))
					TRACE("SendCmdThread:掉到陷阱里面去了!\r\n");
					break;
				case CDEL_STATUS_CONCLOSE://连接已被关闭??
					iSubmitRet = -1;
					TRACE("SendCmdThread:连接已被关闭!\r\n");
					break;
				default:
					TRACE("SendCmdThread:掉到陷阱里面去了!\r\n");
					break;
				}
			}
			else
			{//数据提交超时
				//设置处理标志
				//TRACE("SendCmdThread:数据提交超时!\r\n");
				iSubmitRet = -4;

				pClientSocket->SetError(TRUE);
			}
		}
		FreeChannel(iSocketNo,iChannelNo,ulSgipSerialNo);
//		TRACE("Free one connection's channel!\n");
		//发送失败?
		if(iSubmitRet == -1)
		{//y
			TRACE("MonBufThread Send One Cmd fail! May be Format Error!\n");
			iSubmitRet = -1;
		}
		if(iSubmitRet == -2)
		{
			TRACE("MonBufThread Send One Cmd fail! Send Error!\n");
			iSubmitRet = -3;
		}
		if(iSubmitRet >= 0) iSubmitRet = 0;
		return iSubmitRet;
	}
	return -100;


/*	if(bHGCSocket == TRUE)//HAVE GOT CLIENT SOCKET?
	{//Y
		int iDeliverRet;
		////////////////////
		unsigned long ulSgipSerialTime = SetSgipSerialTime();

		iDeliverRet = pClientSocket->DeliverPDU(ulSgipSerialNo,ulSgipSerialTime,
							strUserNum,strContent,iMsgCoding);
		
		FreeChannel(iSocketNo,iChannelNo,ulSgipSerialNo);
//		TRACE("Free one connection's channel!\n");
		//发送失败?

		if(iDeliverRet == -1)
		{//y
			TRACE("MonBufThread Send One Cmd fail! May be Format Error!\n");
			return -1;
		}
		if(iDeliverRet == -2)
		{
			TRACE("MonBufThread Send One Cmd fail! Send Error!\n");
			return -3;
		}
	}
	return 0;*/
}

/////////////////////////////////////////////////////////
//function:deliver one msg
//retval: 0: ok
//        -1: Submit error
//        -2: no connections
//        -3: 网络连接错误
//        -4:time out
//        -100:other error
/////////////////////////////////////////////////////
int CSocketResource::SubmitOneMsg(CString strContent, CString strDestPhoneNum, CString strFeePhoneNo, unsigned long ulSgipSerialNo, int iReportFlag,int iMsgCoding, BOOL bWaitResp)
{
	//GET CAN USED SGIP CLIENT CONNECTION
	BOOL bHGCSocket = FALSE;
	int iGCRet;//get client socket return
	int iSocketNo;
	CSgipClientSocket * pClientSocket;
	int iChannelNo;
	int iBufNo = 0;
	CString strSgipSerialNo;
	strSgipSerialNo.Format("%d",ulSgipSerialNo);
//	TRACE("SubmitOneMsg: ulSgipSerialNo is :"+strSgipSerialNo+"\n");
	iGCRet = GetClientSocket(&iSocketNo,&pClientSocket,&iChannelNo,ulSgipSerialNo,iBufNo);
	switch(iGCRet)
	{
	case 0://= 0  还未用到最后一个连接
		bHGCSocket = TRUE;
		break;
	case 1://= 1  已用到最后一个连接
		bHGCSocket = TRUE;
		break;
	case -1://= -1 无可用连接
		bHGCSocket = FALSE;
		TRACE("MonBufThread Send One Cmd fail!No Connection!\n");
		return -2;
		break;
	case -2://= -2 网络连接错误
		bHGCSocket = FALSE;
		TRACE("MonBufThread Send One Cmd fail!网络连接错误!\n");
		return -3;
		break;
	case -100://= -100 undefined error!!!
		bHGCSocket = FALSE;
	default:
		bHGCSocket = FALSE;
		return -100;
		TRACE("MonBufThread Send One Cmd fail!other error!\n");
		break;
	}

	if(bHGCSocket == TRUE)//HAVE GOT CLIENT SOCKET?
	{//Y
		int iSubmitRet;
		////////////////////
		unsigned long ulSgipSerialTime = SetSgipSerialTime();

		iSubmitRet = pClientSocket->SubmitPDU(ulSgipSerialNo,ulSgipSerialTime,strFeePhoneNo,
										1,strDestPhoneNum,strContent,
										"","", iReportFlag,
										iMsgCoding);

		if(iSubmitRet >= 0 && bWaitResp)
		{
			HANDLE *hSubmit = pClientSocket->GethSubmit(iChannelNo);
			DWORD dwWaitResult = WaitForSingleObject(*hSubmit, 2 * 1000);
			int   iLastError;
			switch(dwWaitResult)
			{
			case WAIT_ABANDONED:
				TRACE("WaitForSingleObject:WAIT_ABANDONED!\r\n");
				break;
			case WAIT_OBJECT_0:
				//TRACE("WaitForSingleObject:WAIT_OBJECT_0!\r\n");
				break;
			case WAIT_TIMEOUT:
				TRACE("WaitForSingleObject:WAIT_TIMEOUT!\r\n");
				break;
			case WAIT_FAILED:
				TRACE("WaitForSingleObject:WAIT_FAILED!\r\n");
				iLastError = GetLastError();
				break;
			}

			if(dwWaitResult == WAIT_OBJECT_0)
			{
				int iSubStatus = pClientSocket->GetChannelSubmitStatus(iChannelNo);
				switch(iSubStatus)
				{
				case CSUB_STATUS_NOSUBMIT://not submit
					//???如果到这里那就出错了!!!!
					TRACE("SendCmdThread:掉到陷阱里面去了!\r\n");
					break;
				case CSUB_STATUS_SUBMITOK://submit ok
					iSubmitRet = 0;
					//TRACE("SendCmdThread:submit ok!\r\n");
					break;
				case CSUB_STATUS_SUBMITFAIL://submit fail
					iSubmitRet = -1;
					TRACE("SendCmdThread:submit fail!\r\n");
					break;
				case CSUB_STATUS_SUBMITTIMEOUT://submit timeout(submit线程使用:好象都没什么用??(看下面))
					TRACE("SendCmdThread:掉到陷阱里面去了!\r\n");
					break;
				case CSUB_STATUS_CONCLOSE://连接已被关闭??
					iSubmitRet = -1;
					TRACE("SendCmdThread:连接已被关闭!\r\n");
					break;
				default:
					TRACE("SendCmdThread:掉到陷阱里面去了!\r\n");
					break;
				}
			}
			else
			{//数据提交超时
				//设置处理标志
				//TRACE("SendCmdThread:数据提交超时!\r\n");
				iSubmitRet = -4;

				pClientSocket->SetError(TRUE);
			}
		}
		FreeChannel(iSocketNo,iChannelNo,ulSgipSerialNo);
//		TRACE("Free one connection's channel!\n");
		//发送失败?
		if(iSubmitRet == -1)
		{//y
			TRACE("MonBufThread Send One Cmd fail! May be Format Error!\n");
			iSubmitRet = -1;
		}
		if(iSubmitRet == -2)
		{
			TRACE("MonBufThread Send One Cmd fail! Send Error!\n");
			iSubmitRet = -3;
		}
		if(iSubmitRet >= 0) iSubmitRet = 0;
		return iSubmitRet;
	}
	return -100;
}

//////////////////////////////////////////////////////////////////////////
//function:gernate sgipserialtime
//input:
//retval: the sgipserialtime
/////////////////////////////////////////////////////////////////////////
unsigned long CSocketResource::SetSgipSerialTime()
{
	CTime tm = CTime::GetCurrentTime();
	int iMonth = tm.GetMonth();
	int iDay = tm.GetDay();
	int iHour = tm.GetHour();
	int iMinute = tm.GetMinute();
	int iSecond = tm.GetSecond();
	return (iMonth * 100000000 + iDay * 1000000 + iHour * 10000 + iMinute * 100 + iSecond);	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -