Beispiel #1
0
void CIocpServer::CloseClientSocket()
{
	CCriSecLock locallock1(m_csClientSocket);

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

		{
			CCriSecLock2 locallock2(pSocketObj->crisec);

			SOCKET& sock = pSocketObj->socket;
			if(sock != INVALID_SOCKET)
			{
				shutdown(sock, SD_RECEIVE);
				::ManualCloseSocket(sock, FALSE, TRUE);
				sock = INVALID_SOCKET;
			}
		}

		DeleteSocketObj(pSocketObj);
	}

	m_mpClientSocket.clear();
}
Beispiel #2
0
void CIocpServer::AddFreeSocketObj(DWORD dwConnID, BOOL bClose, BOOL bGraceful, BOOL bReuseAddress)
{
	BOOL bDone	= FALSE;

	{
		CCriSecLock locallock1(m_csClientSocket);
		CCriSecLock locallock2(m_csFreeSocket);

		TSocketObjPtrMapI it = m_mpClientSocket.find(dwConnID);

		if(it != m_mpClientSocket.end())
		{
			TSocketObj* pSocketObj = it->second;
			if(bClose && pSocketObj->socket != INVALID_SOCKET)
			{
				::ManualCloseSocket(pSocketObj->socket, bGraceful, bReuseAddress);
				pSocketObj->socket = INVALID_SOCKET;
			}

			m_mpClientSocket.erase(it);
			m_lsFreeSocket.push_back(pSocketObj);

			bDone = TRUE;
		}
	}

	if(bDone && m_lsFreeSocket.size() > m_dwFreeSocketObjHold)
		CompressFreeSocket(m_dwFreeSocketObjPool);
}
Beispiel #3
0
BOOL CTcpServer::InvalidSocketObj(TSocketObj* pSocketObj)
{
	BOOL bDone = FALSE;

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

			if(TSocketObj::IsValid(pSocketObj))
			{
				TSocketObj::Invalid(pSocketObj);
				bDone = TRUE;
			}
		}
	}
	else
	{
		if(TSocketObj::IsValid(pSocketObj))
		{
			CCriSecLock locallock(pSocketObj->csSend);

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

	return bDone;
}
Beispiel #4
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;
}
Beispiel #5
0
BOOL CIocpServer::Send(DWORD dwConnID, const BYTE* pBuffer, int iLen)
{
	ASSERT(iLen > 0);

	TSocketObj* pSocketObj	= NULL;

	{
		CCriSecLock locallock1(m_csClientSocket);

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

	if(pSocketObj == NULL)
		return FALSE;

	CCriSecLock2 locallock2(pSocketObj->crisec);

	int iRemain	= iLen;

	while(iRemain > 0)
	{
		int iBufferSize = min(iRemain, (int)m_dwIocpBufferSize);
		TBufferObj* pBufferObj = GetFreeBufferObj(iBufferSize);
		memcpy(pBufferObj->buff.buf, pBuffer, iBufferSize);

		if(DoSend(pSocketObj, pBufferObj) != NO_ERROR)
			return FALSE;

		iRemain -= iBufferSize;
		pBuffer += iBufferSize;
	}

	return TRUE;
}