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