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

📄 socketresource.cpp

📁 1、自己编写的遵循SGIP1.1协议的短信客户端程序。仅供测试、学习。 2、该程序只实现了SGIP1.1协议的一部分。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SocketResource.cpp: implementation of the CSocketResource class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SgipServiceDemo.h"
#include "SocketResource.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSocketResource::CSocketResource()
{
	int i;

	m_ListenSocket.SetManager(this);

	for(i = 0; i < CR_MAX_CLIENT_NUM; i++)
	{
		//m_ClientSocket[i].SetManager(this);
		m_ClientSocket[i].iSocketNo = i;
		m_ClientSocket[i].pClientSocket = NULL;
	}

	for(i = 0; i < CR_MAX_SERVER_NUM; i++)
	{
		m_ServerSocket[i].iStatus = 0;
		m_ServerSocket[i].iSocketNo = i;
		m_ServerSocket[i].pServerSocket = NULL;
	}

	m_bInited = FALSE;
}

CSocketResource::~CSocketResource()
{
	int i;
	for(i = 0; i < CR_MAX_SERVER_NUM; i++)
	{
		if(m_ServerSocket[i].pServerSocket != NULL)
		{
			delete m_ServerSocket[i].pServerSocket;
		}
	}

	for(i = 0; i < CR_MAX_CLIENT_NUM; i++)
	{
		delete m_ClientSocket[i].pClientSocket;
	}
}

//////////////////////////////////////////////////
//function: let the res manager init the sockets
//			(including clients,servers',listen sockets)
////////////////////////////////////////////////////
BOOL CSocketResource::InitSocket(t_INIT_DEF ini_def)
{	
	if(m_bInited) return FALSE;

	m_ini_def = ini_def;
	InitClientSocket();
	InitServerSocket();
	m_ListenSocket.Listen(m_ini_def.iLocalLisPort);

	m_bInited = TRUE;
	return TRUE;
}

//////////////////////////////////////////////////
//function: let the res manager init the sockets
//			(including clients,servers',listen sockets)
////////////////////////////////////////////////////
BOOL CSocketResource::ReInitSocket()
{	

	//清除所有未用的并且发生错误的ClientSocket。

	int i;
	for(i = 0; i < CR_MAX_CLIENT_NUM; i++)
	{
		if(NULL != m_ClientSocket[i].pClientSocket)
		{
			if(m_ClientSocket[i].pClientSocket->HaveError())
			{
				m_ClientSocket[i].pClientSocket->Close();
			}
			else continue;
			//while(该socket的通道仍然未完全被归还) 等待!
			//while(.....) Sleep(1);
			while(0 != m_ClientSocket[i].pClientSocket->GetUsedChannels())
			{
				Sleep(1);
			}
			delete m_ClientSocket[i].pClientSocket;
			m_ClientSocket[i].pClientSocket = NULL;

			m_ClientSocket[i].pClientSocket = new CSgipClientSocket();
			m_ClientSocket[i].pClientSocket->SetGatewayIP(m_ini_def.strServerIP);
			m_ClientSocket[i].pClientSocket->SetLoginName(m_ini_def.strServerUserName);
			m_ClientSocket[i].pClientSocket->SetLoginPassword(m_ini_def.strServerPwd);
	//		m_ClientSocket[i].pClientSocket->SetSourceID(m_ini_def.lSourceID);
			m_ClientSocket[i].pClientSocket->SetSPNumber(m_ini_def.iSPNumber);
	//++    m_ClientSocket[i].pClientSocket->SetChargeNumber(m_ini_def.m_strFeePhoneNo);
			m_ClientSocket[i].pClientSocket->SetPort(m_ini_def.iServerLisPort);	

			m_ClientSocket[i].pClientSocket->Create();

		}
	}
	return TRUE;
}

//////////////////////////////////////////////////
//function: let the res manager exit the sockets
//			(including clients,servers',listen sockets)
////////////////////////////////////////////////////
BOOL CSocketResource::ExitSocket()
{	
	if(!m_bInited) return FALSE;

	m_ListenSocket.Close();
	CloseClientSocket();
	CloseServerSocket();
	m_bInited = FALSE;

	return TRUE;
}

BOOL CSocketResource::InitClientSocket()
{
	int i;

	for(i = 0; i < CR_MAX_CLIENT_NUM; i++)
	{
		//m_ClientSocket[i].SetManager(this);
		//ASSERT(NULL == m_ClientSocket[i].pClientSocket);

		m_ClientSocket[i].pClientSocket = new CSgipClientSocket();
		m_ClientSocket[i].pClientSocket->SetGatewayIP(m_ini_def.strServerIP);
		m_ClientSocket[i].pClientSocket->SetLoginName(m_ini_def.strServerUserName);
		m_ClientSocket[i].pClientSocket->SetLoginPassword(m_ini_def.strServerPwd);
//		m_ClientSocket[i].pClientSocket->SetSourceID(m_ini_def.lSourceID);
		m_ClientSocket[i].pClientSocket->SetSPNumber(m_ini_def.iSPNumber);
//++    m_ClientSocket[i].pClientSocket->SetChargeNumber(m_ini_def.m_strFeePhoneNo);
		m_ClientSocket[i].pClientSocket->SetPort(m_ini_def.iServerLisPort);	

		m_ClientSocket[i].pClientSocket->Create();
		//m_ClientSocket[i].iSocketNo = i;
		//m_ClientSocket[i].pClientSocket = NULL;
	}

	return TRUE;
}

BOOL CSocketResource::InitServerSocket()
{
	int i;
	for(i = 0; i < CR_MAX_SERVER_NUM; i++)
	{
		m_ServerSocket[i].pServerSocket = NULL;
	}
	return TRUE;
}

BOOL CSocketResource::CloseClientSocket()
{
	int i;
	for(i = 0; i < CR_MAX_CLIENT_NUM; i++)
	{
		if(NULL != m_ClientSocket[i].pClientSocket)
		{
			m_ClientSocket[i].pClientSocket->Close();
			//++
			//while(该socket的通道仍然未完全被归还) 等待!
			//while(.....) Sleep(1);
			while(0 != m_ClientSocket[i].pClientSocket->GetUsedChannels())
			{
				Sleep(1);
			}
			delete m_ClientSocket[i].pClientSocket;
			m_ClientSocket[i].pClientSocket = NULL;
		}
		//m_ClientSocket[i].Close();
	}
	return TRUE;
}

BOOL CSocketResource::CloseServerSocket()
{
	int i;
	for(i = 0; i < CR_MAX_SERVER_NUM; i++)
	{
		if(NULL != m_ServerSocket[i].pServerSocket) 
		{
			//m_ServerSocket[i].pServerSocket->OnClose(0);
			m_ServerSocket[i].pServerSocket->Close();
			delete m_ServerSocket[i].pServerSocket;
			m_ServerSocket[i].pServerSocket = NULL;
		}
	}
	return TRUE;
}

////////////////////////////////////////////////////////
//function: get can use client connection
//input: 
//retvalue: = 0  还未用到最后一个连接
//          = 1  已用到最后一个连接
//          = -1 无可用连接
//          = -2 网络连接错误
//          = -100 undefined error
//注意:调用者从这里得到的ppClientSocket指针以后,
//		要按照约定的用法(暂略)使用!
////////////////////////////////////////////////////////
int CSocketResource::GetClientSocket(int *piSocketNo,CSgipClientSocket **ppClientSocket,int *piChannelNo ,unsigned long ulSgipSerialNo ,int iCmdBufNo)
{

//	ASSERT(pMainDlg != NULL);

	CSingleLock singleLock(&m_CritSectionClient);
	int iRetValue = -100;
	int i;
	int iChannelNo = -1;
	//int iFNullConNo = -1;
	int iFNotCConNo = -1;//first not connected connection No.
	int iNFCCNum = 0;//no free channels connection num
	//int iToConNo = -1;//to connect connection no.
	//wait until critsection unlock!
	if(singleLock.Lock()&&singleLock.IsLocked())
	{//lock ok so must unlock it before return!!!!
		//-检测有无正处于连接状态而且有可用通道的连接
			//--有可用的通道则进行分配,后根据资源使用状况返回0或1
			//--无可用通道,那么是否还有未使用连接
				//---有未使用连接则进行连接,成功?
					//----成功,进行分配,后根据资源使用状况返回0或1
					//----未成功,返回-2
				//---无未使用连接则返回 -1
		for(i = 0; i < CR_MAX_CLIENT_NUM; i++)
		{
			ASSERT(NULL != m_ClientSocket[i].pClientSocket);

			if(m_ClientSocket[i].pClientSocket->IsConnected()
				&& m_ClientSocket[i].pClientSocket->IsBinded())
			{
				if((iChannelNo = m_ClientSocket[i].pClientSocket->GetChannel()) != -1)
				{
					*ppClientSocket = m_ClientSocket[i].pClientSocket;
					*piChannelNo = iChannelNo;
					*piSocketNo = i;
					m_ClientSocket[i].pClientSocket->SetChannelSerialNo(iChannelNo,ulSgipSerialNo);
					m_ClientSocket[i].pClientSocket->SetChannelCmdBufNo(iChannelNo,iCmdBufNo);
					m_ClientSocket[i].pClientSocket->SetChannelStatus(iChannelNo,1);//be used
					m_ClientSocket[i].pClientSocket->SetChannelSubmitStatus(iChannelNo,0);//not submit
					m_ClientSocket[i].pClientSocket->ResetChannelSubmitEvent(iChannelNo);//reset channel event
					break;
				}
				else
				{
					iNFCCNum++;
				}
			}
			else if(iFNotCConNo == -1)
			{
				iFNotCConNo = i;
			}

		}

		if(iChannelNo != -1)//已分配?
		{//y
			if(iNFCCNum >= CR_MAX_CLIENT_NUM)//all connections are used now?
			{//y
				iRetValue = 1;
			}
			else
			{//n
				iRetValue = 0;
			}
		}
		else
		{//n

			if(iNFCCNum >= CR_MAX_CLIENT_NUM)//all connections are used now?
			{//y
				iRetValue = -1;
			}
			else if(iFNotCConNo != -1)//第一个未用的连接号合法?
			{//y
				//ASSERT(NULL != m_ClientSocket[iFNotCConNo].pClientSocket);

				if(ConSocket(iFNotCConNo) == 0) //connect to sgip ok?
				{//y
					if(m_ClientSocket[iFNotCConNo].pClientSocket->IsConnected()
						&& m_ClientSocket[iFNotCConNo].pClientSocket->IsBinded())//again check if it is connected to sgip ok?
					{
						if((iChannelNo = m_ClientSocket[iFNotCConNo].pClientSocket->GetChannel()) != -1)
						{
							*ppClientSocket = m_ClientSocket[iFNotCConNo].pClientSocket;
							*piChannelNo = iChannelNo;
							*piSocketNo = iFNotCConNo;
							m_ClientSocket[iFNotCConNo].pClientSocket->SetChannelSerialNo(iChannelNo,ulSgipSerialNo);
							m_ClientSocket[iFNotCConNo].pClientSocket->SetChannelStatus(iChannelNo,1);//be used
							m_ClientSocket[iFNotCConNo].pClientSocket->SetChannelSubmitStatus(iChannelNo,0);//not submit
							m_ClientSocket[iFNotCConNo].pClientSocket->ResetChannelSubmitEvent(iChannelNo);//reset channel event

							if(iNFCCNum >= CR_MAX_CLIENT_NUM-1)//all connections are used now?
							{//y
								iRetValue = 1;
							}
							else
							{//n
								iRetValue = 0;
							}
						}
						else
						{//n (**按照设计应该不会掉到这里来的)
							iRetValue = -100;
						}
					}
					else
					{//n (**按照设计应该不会掉到这里来的)
						iRetValue = -100;
					}
				}
				else
				{//n
					iRetValue = -2;
				}
			}
			else
			{//n (**按照设计应该不会掉到这里来的)
				iRetValue = -100;
			}
		}

		singleLock.Unlock();
	}
	
	return iRetValue; 
}
/*////////////////////////////////////////////////////////
//function:get the sgip client socket's pointer by socket No.
//注意:调用者从这里得到的ppClientSocket指针以后,
//		要按照约定的用法(暂略)使用!
CSgipClientSocket* CSocketResource::GetClientSocket(int iSocketNo)
{
	//++must check the iSocketNo
	return &m_ClientSocket[iSocketNo];
}*/

/////////////////////////////////////////////////////////
//function:connect the socket specified by "iSocketNo"
//retval: 0: ok
//        -1: connect time out
//        -2: Client Socket not Created!!!
//        -3:other error
/////////////////////////////////////////////////////
int CSocketResource::ConSocket(int iSocketNo)
{
//	ASSERT(pMainDlg != NULL);

	int iRet = -3;

	ASSERT(NULL != m_ClientSocket[iSocketNo].pClientSocket);

	if(!m_ClientSocket[iSocketNo].pClientSocket->IsConnected())
	{
		UINT uPort = m_ClientSocket[iSocketNo].pClientSocket->GetPort();
		CString strGatewayIP = m_ClientSocket[iSocketNo].pClientSocket->GetGatewayIP();
		/*if(!m_ClientSocket[iSocketNo].pClientSocket->IsCreated())
		{
			return -2;
		//	ASSERT(m_pMainWnd != NULL);
		//	m_pMainWnd->SendMessage(WM_UPDATE_DLGDATA,0,0);
		//	m_pMainWnd
		}*/
		BOOL bConnectOk = m_ClientSocket[iSocketNo].pClientSocket->Connect(strGatewayIP, uPort);
		if(!bConnectOk)
			return -3;
		if (WaitForSingleObject(m_ClientSocket[iSocketNo].pClientSocket->m_hClientConnect, 2000) == WAIT_OBJECT_0)
		{
			m_ClientSocket[iSocketNo].pClientSocket->BindToGageway();
			if (WaitForSingleObject(m_ClientSocket[iSocketNo].pClientSocket->m_hClientBind, 2*1000) == WAIT_OBJECT_0)
			{
				if (m_ClientSocket[iSocketNo].pClientSocket->m_bBinded)
				{
					iRet = 0;
				}
				else
				{//呵呵,不知道为什么会错了?!!!
					iRet = -3;
				}
			}
			else
			{
				iRet = -1;
			}
		}
		else
		{
			iRet = -1;
		}
	}
	else
	{
		if(m_ClientSocket[iSocketNo].pClientSocket->m_bBinded)
		{
			iRet = 0;
		}
		else
		{
			m_ClientSocket[iSocketNo].pClientSocket->BindToGageway();
			if (WaitForSingleObject(m_ClientSocket[iSocketNo].pClientSocket->m_hClientBind, 2 * 1000) == WAIT_OBJECT_0)
			{
				if (m_ClientSocket[iSocketNo].pClientSocket->m_bBinded)
				{
					iRet = 0;
				}
				else
				{//呵呵,不知道为什么会错了?!!!
					iRet = -3;
				}
			}
			else
			{
				iRet = -1;
			}
		}
	}
	return iRet;
}


BOOL CSocketResource::FreeChannel(int iSocketNo, int iChannelNo, unsigned long ulSgipSerialNo)
{
	CSingleLock singleLock(&m_CritSectionClient);
	BOOL bRet = FALSE;
	//wait until critsection unlock!
	if(singleLock.Lock()&&singleLock.IsLocked())
	{//lock ok so must unlock it before return!!!!
		ASSERT(NULL != m_ClientSocket[iSocketNo].pClientSocket);
		bRet = m_ClientSocket[iSocketNo].pClientSocket->FreeChannel(iChannelNo,ulSgipSerialNo);
		singleLock.Unlock();
	}
	return bRet;
}

BOOL CSocketResource::SetChannelStatus(int iSocketNo, int iChannelNo, int iStatus)
{
	CSingleLock singleLock(&m_CritSectionClient);
	BOOL bRet = FALSE;
	//wait until critsection unlock!
	if(singleLock.Lock()&&singleLock.IsLocked())

⌨️ 快捷键说明

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