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(); }
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); }
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; }
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; }
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; }