示例#1
0
TItem* CUdpCast::GetSendBuffer()
{
	TItem* pItem = nullptr;

	if(m_lsSend.Size() > 0)
	{
		CCriSecLock locallock(m_csSend);

		if(m_lsSend.Size() > 0)
			pItem = m_lsSend.PopFront();
	}

	return pItem;
}
示例#2
0
TSocketObj* CTcpServer::FindSocketObj(CONNID dwConnID)
{
	TSocketObj* pSocketObj = nullptr;

	{
		CReentrantReadLock locallock(m_csClientSocket);

		TSocketObjPtrMapCI it = m_mpClientSocket.find(dwConnID);
		if(it != m_mpClientSocket.end())
			pSocketObj = it->second;
	}

	return pSocketObj;
}
示例#3
0
BOOL CTcpAgent::CheckStoping()
{
	CSpinLock locallock(m_csState);

	if(m_enState == SS_STARTED || m_enState == SS_STARTING)
		m_enState = SS_STOPPING;
	else
	{
		SetLastError(SE_ILLEGAL_STATE, __FUNCTION__, ERROR_INVALID_OPERATION);
		return FALSE;
	}

	return TRUE;
}
示例#4
0
TBuffer* CBufferPool::FindCacheBuffer(ULONG_PTR dwID)
{
	ASSERT(dwID != 0);

	TBuffer* pBuffer = nullptr;

	CReentrantReadLock locallock(m_csBufferMap);

	TBufferPtrMapCI it = m_mpBuffer.find(dwID);
	if(it != m_mpBuffer.end())
		pBuffer = it->second;

	return pBuffer;
}
示例#5
0
void CTcpServer::ReleaseClientSocket()
{
	CReentrantWriteLock locallock(m_csClientSocket);

	for(TSocketObjPtrMapI it = m_mpClientSocket.begin(), end = m_mpClientSocket.end(); it != end; ++it)
	{
		TSocketObj* pSocketObj = it->second;

		CloseClientSocketObj(pSocketObj);
		DeleteSocketObj(pSocketObj);
	}

	m_mpClientSocket.clear();
}
示例#6
0
BOOL CCookieMgr::RemoveExpiredCookies(LPCSTR lpszDomain, LPCSTR lpszPath)
{
	CStringA strDomain;
	CStringA strPath;

	if(!AdjustDomainAndPath(lpszDomain, lpszPath, strDomain, strPath, TRUE))
		return FALSE;

	CWriteLock locallock(m_cs);

	RemoveExpiredCookiesNoLock(lpszDomain, lpszPath);

	return TRUE;
}
示例#7
0
void CUdpServer::AddFreeSocketObj(CONNID dwConnID, EnSocketCloseFlag enFlag, EnSocketOperation enOperation, int iErrorCode)
{
	BOOL bDone					= FALSE;
	TUdpSocketObj* pSocketObj	= FindSocketObj(dwConnID);

	if(TUdpSocketObj::IsValid(pSocketObj))
	{
		CCriSecLock locallock(pSocketObj->crisec);

		if(TUdpSocketObj::IsValid(pSocketObj))
		{
			TUdpSocketObj::Invalid(pSocketObj);
			bDone = TRUE;
		}
	}

	if(bDone)
	{
		CloseClientSocketObj(pSocketObj, enFlag, enOperation, iErrorCode);
		TUdpSocketObj::Release(pSocketObj);

		{
			CReentrantWriteLock locallock(m_csClientSocket);

			m_mpClientAddr.erase(&pSocketObj->remoteAddr);
			m_mpClientSocket.erase(dwConnID);
		}

		{
			CCriSecLock locallock(m_csFreeSocket);
			m_lsFreeSocket.push_back(pSocketObj);
		}

		if(m_lsFreeSocket.size() > m_dwFreeSocketObjHold)
			CompressFreeSocket(m_dwFreeSocketObjPool);
	}
}
示例#8
0
TSocketObj*	CIocpServer::GetFreeSocketObj()
{
	CCriSecLock locallock(m_csFreeSocket);

	TSocketObj* pSocketObj = NULL;
	if(m_lsFreeSocket.size() > 0)
	{
		pSocketObj = m_lsFreeSocket.front();
		m_lsFreeSocket.pop_front();
	}
	else
		pSocketObj = CreateSocketObj();

	return pSocketObj;
}
示例#9
0
BOOL CCookieMgr::GetCookies(CCookieSet& cookies, LPCSTR lpszDomain, LPCSTR lpszPath, BOOL bHttp, BOOL bSecure)
{
	ASSERT(lpszDomain && lpszPath);

	CStringA strDomain;
	CStringA strPath;

	if(!AdjustDomainAndPath(lpszDomain, lpszPath, strDomain, strPath, FALSE))
		return FALSE;

	list<LPCSTR> lsDomains(1, lpszDomain);
	list<CStringA> lsPaths(1, lpszPath);

	char c;
	LPCSTR lpszTemp = lpszDomain;

	while((c = *(++lpszTemp)) != 0)
	{
		if(c == COOKIE_DOMAIN_SEP_CHAR)
		{
			if((c = *(++lpszTemp)) != 0)
				lsDomains.push_back(lpszTemp);
			else
				break;
		}
	}

	lpszTemp = lpszPath + strlen(lpszPath) - 1;

	while(--lpszTemp >= lpszPath)
	{
		if((c = *lpszTemp) == COOKIE_PATH_SEP_CHAR)
		{
			*(LPSTR)(lpszTemp + 1) = 0;
			lsPaths.push_back(lpszPath);
		}
	}

	CReadLock locallock(m_cs);

	for(list<LPCSTR>::const_iterator it = lsDomains.begin(), end = lsDomains.end(); it != end; ++it)
	{
		for(list<CStringA>::const_iterator it2 = lsPaths.begin(), end2 = lsPaths.end(); it2 != end2; ++it2)
			MatchCookiesNoLock(cookies, *it, *it2, bHttp, bSecure);
	}

	return TRUE;
}
示例#10
0
EnHandleResult CTcpServer::TriggerFireReceive(TSocketObj* pSocketObj, TBufferObj* pBufferObj)
{
	EnHandleResult rs = (EnHandleResult)HR_CLOSED;

	if(TSocketObj::IsValid(pSocketObj))
	{
		CReentrantSpinLock locallock(pSocketObj->csRecv);

		if(TSocketObj::IsValid(pSocketObj))
		{
			rs = FireReceive(pSocketObj, (BYTE*)pBufferObj->buff.buf, pBufferObj->buff.len);
		}
	}

	return rs;
}
示例#11
0
void CBufferPool::PutFreeBuffer(ULONG_PTR dwID)
{
	ASSERT(dwID != 0);

	TBuffer* pBuffer = FindCacheBuffer(dwID);

	if(pBuffer != nullptr)
	{
		{
			CReentrantWriteLock locallock(m_csBufferMap);
			m_mpBuffer.erase(dwID);
		}

		PutFreeBuffer(pBuffer);
	}
}
示例#12
0
void CTcpServer::CompressFreeSocket(size_t size, BOOL bForce)
{
	CCriSecLock locallock(m_csFreeSocket);

	while(m_lsFreeSocket.size() > size)
	{
		TSocketObj* pSocketObj = m_lsFreeSocket.front();

		if(bForce || ::GetTimeGap32(pSocketObj->freeTime) >= m_dwFreeSocketObjLockTime)
		{
			m_lsFreeSocket.pop_front();
			DeleteSocketObj(pSocketObj);
		}
		else
			break;
	}
}
示例#13
0
int CTcpAgent::DoSendPack(TSocketObj* pSocketObj)
{
	int result = NO_ERROR;

	if(TSocketObj::IsPending(pSocketObj))
	{
		CCriSecLock locallock(pSocketObj->crisec);

		if(TSocketObj::IsValid(pSocketObj))
			result = SendItem(pSocketObj);
	}

	if(!IOCP_SUCCESS(result))
		CheckError(pSocketObj->connID, SO_SEND, result);

	return result;
}
示例#14
0
CBufferPtr* CClientSocket::GetSendBuffer()
{
	CBufferPtr* pBuffer = nullptr;

	if(m_sndBuffers.Size() > 0)
	{
		CCriSecLock locallock(m_scBuffer);

		if(m_sndBuffers.Size() > 0)
		{
			pBuffer = m_sndBuffers->front();
			m_sndBuffers->pop_front();
		}
	}

	return pBuffer;
}
示例#15
0
void CItemPool::PutFreeItem(TItem* pItem)
{
	ASSERT(pItem != nullptr);

	DWORD size = m_lsFreeItem.Size();

	if(size < m_dwPoolHold)
	{
		CCriSecLock locallock(m_csFreeItem);
		m_lsFreeItem.PushBack(pItem);
	}
	else
	{
		TItem::Destruct(pItem);
		CompressFreeItem(m_dwPoolSize);
	}
}
示例#16
0
BOOL CUdpCast::CheckStarting()
{
	CCriSecLock locallock(m_csCheck);

	if(m_enState == SS_STOPPED)
	{
		m_enState = SS_STARTING;
		::_ReadWriteBarrier();
	}
	else
	{
		SetLastError(SE_ILLEGAL_STATE, __FUNCTION__, ERROR_INVALID_OPERATION);
		return FALSE;
	}

	return TRUE;
}
示例#17
0
int CUdpServer::DoSendPack(TUdpSocketObj* pSocketObj)
{
	int result	= NO_ERROR;

	if(TUdpSocketObj::IsPending(pSocketObj))
	{
		CCriSecLock locallock(pSocketObj->crisec);

		if(TUdpSocketObj::IsValid(pSocketObj))
			result = SendItem(pSocketObj);
	}


	if(!IOCP_SUCCESS(result))
		VERIFY(!HasStarted());

	return result;
}
示例#18
0
BOOL CTcpServer::InvalidSocketObj(TSocketObj* pSocketObj)
{
	BOOL bDone = FALSE;

	if(TSocketObj::IsValid(pSocketObj))
	{
		CReentrantSpinLock	locallock(pSocketObj->csRecv);
		CCriSecLock			locallock2(pSocketObj->csSend);

		if(TSocketObj::IsValid(pSocketObj))
		{
			TSocketObj::Invalid(pSocketObj);
			bDone = TRUE;
		}
	}

	return bDone;
}
示例#19
0
VOID CSEMRWLock::ReadDone()
{
	ASSERT(m_nActive != 0);

	INT iFlag = 0;

	if(m_nActive > 0)
	{
		CSpinLock locallock(m_cs);

		if(--m_nActive == 0)
			iFlag = Done();
	}
	else
		ASSERT(IsOwner());

	Notify(iFlag);
}
示例#20
0
TBufferObj*	CIocpServer::GetFreeBufferObj(int iLen)
{
	if(iLen <= 0) iLen = m_dwIocpBufferSize;

	CCriSecLock locallock(m_csFreeBuffer);

	TBufferObj* pBufferObj = NULL;
	if(m_lsFreeBuffer.size() > 0)
	{
		pBufferObj = m_lsFreeBuffer.front();
		m_lsFreeBuffer.pop_front();
	}
	else
		pBufferObj = CreateBufferObj();

	pBufferObj->buff.len = iLen;
	return pBufferObj;
}
示例#21
0
VOID CSWMR::WaitToWrite()
{
	BOOL fResourceOwned;

	{
		CSpinLock locallock(m_cs);

		fResourceOwned = (m_nActive != 0);

		if(fResourceOwned)
			++m_nWaitingWriters;
		else
			m_nActive = -1;
	}

	if(fResourceOwned)
		m_smWrite.Wait();
}
示例#22
0
VOID CSWMR::WaitToRead()
{
	BOOL fResourceWritePending;

	{
		CSpinLock locallock(m_cs);

		fResourceWritePending = (m_nWaitingWriters || (m_nActive < 0));

		if(fResourceWritePending)
			++m_nWaitingReaders;
		else
			++m_nActive;
	}

	if(fResourceWritePending)
		m_smRead.Wait();
}
示例#23
0
template<class T, USHORT default_port> BOOL CHttpAgentT<T, default_port>::StartHttp(TSocketObj* pSocketObj)
{
	if(!pSocketObj->HasConnected())
	{
		::SetLastError(ERROR_INVALID_STATE);
		return FALSE;
	}

	CCriSecLock locallock(pSocketObj->csSend);

	if(!TSocketObj::IsValid(pSocketObj))
	{
		::SetLastError(ERROR_OBJECT_NOT_FOUND);
		return FALSE;
	}

	if(!pSocketObj->HasConnected())
	{
		::SetLastError(ERROR_INVALID_STATE);
		return FALSE;
	}

	THttpObj* pHttpObj = FindHttpObj(pSocketObj);

	if(pHttpObj != nullptr)
	{
		::SetLastError(ERROR_ALREADY_INITIALIZED);
		return FALSE;
	}

	DoStartHttp(pSocketObj);

	if(!IsSecure())
		FireHandShake(pSocketObj);
	else
	{
#ifdef _SSL_SUPPORT
		if(IsSSLAutoHandShake())
			StartSSLHandShake(pSocketObj);
#endif
	}

	return TRUE;
}
示例#24
0
void CBufferPool::CompressFreeBuffer(int size)
{
	CCriSecLock locallock(m_csFreeBuffer);

	DWORD now = ::TimeGetTime();

	while(m_lsFreeBuffer.Size() > size)
	{
		TBuffer* pBuffer = m_lsFreeBuffer.Front();

		if(now - pBuffer->freeTime >= m_dwBufferLockTime)
		{
			m_lsFreeBuffer.PopFront();
			TBuffer::Destruct(pBuffer);
		}
		else
			break;
	}
}
示例#25
0
VOID CMutexRWLock::ReadDone()
{
	ASSERT(m_nActive != 0);

	if(m_nActive > 0)
	{
		ASSERT(m_nReadCount > 0);

		CSpinLock locallock(m_cs);

		if(--m_nActive == 0)
		{
			for(; m_nReadCount > 0; --m_nReadCount)
				m_mtx.unlock_shared();
		}
	}
	else
		ASSERT(IsOwner());
}
示例#26
0
TItem* CItemPool::PickFreeItem()
{
	TItem* pItem = nullptr;

	if(m_lsFreeItem.Size() > 0)
	{
		CCriSecLock locallock(m_csFreeItem);

		if(m_lsFreeItem.Size() > 0)
			pItem = m_lsFreeItem.PopFront();
	}

	if(pItem == nullptr)
		pItem = TItem::Construct(m_heap, m_dwItemCapacity);
	else
		pItem->Reset();

	return pItem;
}
示例#27
0
VOID CSEMRWLock::WriteDone()
{
	ASSERT(IsOwner());
	ASSERT(m_nActive < 0);

	INT iFlag = 0;

	{
		CSpinLock locallock(m_cs);

		if(++m_nActive == 0)
		{
			DetachOwner();
			iFlag = Done();
		}
	}

	Notify(iFlag);
}
示例#28
0
void CTcpClient::Reset()
{
	CCriSecLock locallock(m_csSend);

	m_evSend.Reset();
	m_evRecv.Reset();
	m_evStop.Reset();

	m_lsSend.Clear();
	m_itPool.Clear();
	m_rcBuffer.Free();

	m_strHost.Empty();

	m_usPort	= 0;
	m_nEvents	= 0;
	m_bPaused	= FALSE;
	m_enState	= SS_STOPPED;
}
示例#29
0
void CTcpAgent::CompressFreeSocket(size_t size, BOOL bForce)
{
	CCriSecLock locallock(m_csFreeSocket);

	DWORD now = ::TimeGetTime();

	while(m_lsFreeSocket.size() > size)
	{
		TSocketObj* pSocketObj = m_lsFreeSocket.front();

		if(bForce || (now - pSocketObj->freeTime) >= m_dwFreeSocketObjLockTime)
		{
			m_lsFreeSocket.pop_front();
			DeleteSocketObj(pSocketObj);
		}
		else
			break;
	}
}
示例#30
0
BOOL CTcpClient::DoSendData(TItem* pItem)
{
	while(!pItem->IsEmpty())
	{
		int rc = 0;

		{
			CCriSecLock locallock(m_csSend);

			rc = send(m_soClient, (char*)pItem->Ptr(), min(pItem->Size(), (int)m_dwSocketBufferSize), 0);
			if(rc > 0) m_iPending -= rc;
		}

		if(rc > 0)
		{
			if(FireSend(this, pItem->Ptr(), rc) == HR_ERROR)
			{
				TRACE("<C-CNNID: %Iu> OnSend() event should not return 'HR_ERROR' !!\n", m_dwConnID);
				ASSERT(FALSE);
			}

			pItem->Reduce(rc);
		}
		else if(rc == SOCKET_ERROR)
		{
			int code = ::WSAGetLastError();

			if(code == WSAEWOULDBLOCK)
				break;
			else
			{
				SetLastError(SE_NETWORK, __FUNCTION__, code);
				FireError(this, SO_SEND, code);

				return FALSE;
			}
		}
		else
			ASSERT(FALSE);
	}

	return TRUE;
}