📄 socketresource.cpp
字号:
// 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 + -