void CUdpServer::HandleSend(CONNID dwConnID, TUdpBufferObj* pBufferObj) { BOOL bNeedFree = FALSE; switch(m_enSendPolicy) { case SP_PACK: { TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TUdpSocketObj::IsValid(pSocketObj)) { long sndCount = ::InterlockedDecrement(&pSocketObj->sndCount); TriggerFireSend(dwConnID, pBufferObj); if(sndCount == 0) DoSendPack(pSocketObj); } else bNeedFree = TRUE; } break; case SP_SAFE: { long sndCount = -1; TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TUdpSocketObj::IsValid(pSocketObj)) { sndCount = ::InterlockedDecrement(&pSocketObj->sndCount); if(sndCount == 0 && !pSocketObj->smooth) { CCriSecLock locallock(pSocketObj->crisec); if((sndCount = pSocketObj->sndCount) == 0) pSocketObj->smooth = TRUE; } TriggerFireSend(dwConnID, pBufferObj); if(sndCount == 0) DoSendSafe(pSocketObj); } else bNeedFree = TRUE; } break; case SP_DIRECT: { TriggerFireSend(dwConnID, pBufferObj); } break; default: ASSERT(FALSE); } if(bNeedFree) AddFreeBufferObj(pBufferObj); }
void CUdpServer::HandleZeroBytes(CONNID dwConnID, TUdpBufferObj* pBufferObj) { if(pBufferObj->operation == SO_RECEIVE) { if(dwConnID == 0) dwConnID = HandleAccept(pBufferObj); if(dwConnID != 0) { TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TUdpSocketObj::IsValid(pSocketObj)) { pSocketObj->detectFails = 0; DoSend(pSocketObj, nullptr, 0); } TRACE("<S-CNNID: %Iu> recv 0 bytes (detect package)\n", dwConnID); } DoReceive(pBufferObj); } else { ASSERT(dwConnID != 0); TRACE("<S-CNNID: %Iu> send 0 bytes (detect package)\n", dwConnID); } }
void CTcpAgent::AddFreeSocketObj(CONNID dwConnID, EnSocketCloseFlag enFlag, EnSocketOperation enOperation, int iErrorCode) { BOOL bDone = FALSE; TSocketObj* pSocketObj = FindSocketObj(dwConnID);; if(TUdpSocketObj::IsValid(pSocketObj)) { CReentrantWriteLock locallock(m_csClientSocket); if(TSocketObj::IsValid(pSocketObj)) { TSocketObj::Invalid(pSocketObj); bDone = TRUE; } } if(bDone) { CloseClientSocketObj(pSocketObj, enFlag, enOperation, iErrorCode); TSocketObj::Release(pSocketObj); { CReentrantWriteLock locallock(m_csClientSocket); m_mpClientSocket.erase(dwConnID); } { CCriSecLock locallock(m_csFreeSocket); m_lsFreeSocket.push_back(pSocketObj); } if(m_lsFreeSocket.size() > m_dwFreeSocketObjHold) CompressFreeSocket(m_dwFreeSocketObjPool); } }
void CUdpServer::HandleZeroBytes(CONNID dwConnID, TUdpBufferObj* pBufferObj) { if(pBufferObj->operation == SO_RECEIVE) { if(dwConnID == 0) dwConnID = HandleAccept(pBufferObj); if(dwConnID != 0) { TRACE("<S-CNNID: %Iu> recv 0 bytes (detect package)\n", dwConnID); TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TUdpSocketObj::IsValid(pSocketObj)) { pSocketObj->detectFails = 0; SendDetectPackage(dwConnID, pSocketObj); } } DoReceive(pBufferObj); } else VERIFY(FALSE); }
void CTcpAgent::ForceDisconnect(CONNID dwConnID) { TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TSocketObj::IsValid(pSocketObj)) AddFreeSocketObj(dwConnID, SCF_CLOSE); }
void CUdpServer::AddFreeSocketObj(CONNID dwConnID) { BOOL bDone = FALSE; TUdpSocketObj* pSocketObj = nullptr; { CReentrantWriteLock locallock(m_csClientSocket); pSocketObj = FindSocketObj(dwConnID); if(pSocketObj != nullptr) { m_mpClientAddr.erase(&pSocketObj->clientAddr); m_mpClientSocket.erase(dwConnID); bDone = TRUE; } } if(bDone) { { CCriSecLock locallock(m_csFreeSocket); pSocketObj->freeTime = ::TimeGetTime(); m_lsFreeSocket.push_back(pSocketObj); } if(m_lsFreeSocket.size() > m_dwFreeSocketObjHold) CompressFreeSocket(m_dwFreeSocketObjPool); } }
void CUdpServer::ForceDisconnect(CONNID dwConnID) { TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TUdpSocketObj::IsValid(pSocketObj)) AddFreeSocketObj(dwConnID, SCF_CLOSE); }
BOOL CTcpAgent::Send(CONNID dwConnID, const BYTE* pBuffer, int iLength, int iOffset) { ASSERT(pBuffer && iLength > 0); if(iOffset != 0) pBuffer += iOffset; int result = NO_ERROR; TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(!TSocketObj::IsValid(pSocketObj)) result = ERROR_OBJECT_NOT_FOUND; else { CCriSecLock locallock(pSocketObj->crisec); if(!TSocketObj::IsValid(pSocketObj)) result = ERROR_OBJECT_NOT_FOUND; else { switch(m_enSendPolicy) { case SP_PACK: result = SendPack(pSocketObj, pBuffer, iLength); break; case SP_SAFE: result = SendSafe(pSocketObj, pBuffer, iLength); break; case SP_DIRECT: result = SendDirect(pSocketObj, pBuffer, iLength); break; default: ASSERT(FALSE); result = ERROR_INVALID_INDEX; break; } } } if(result != NO_ERROR) ::SetLastError(result); return (result == NO_ERROR); }
int CUdpServer::DoSend(CONNID dwConnID) { TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TUdpSocketObj::IsValid(pSocketObj)) return DoSend(pSocketObj); return ERROR_OBJECT_NOT_FOUND; }
int CTcpAgent::DoSend(CONNID dwConnID) { TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TSocketObj::IsValid(pSocketObj)) return DoSend(pSocketObj); return ERROR_OBJECT_NOT_FOUND; }
void CTcpAgent::AddClientSocketObj(CONNID dwConnID, TSocketObj* pSocketObj) { ASSERT(FindSocketObj(dwConnID) == nullptr); pSocketObj->connTime = ::TimeGetTime(); CReentrantWriteLock locallock(m_csClientSocket); m_mpClientSocket[dwConnID] = pSocketObj; }
void CTcpServer::AddClientSocketObj(CONNID dwConnID, TSocketObj* pSocketObj) { ASSERT(FindSocketObj(dwConnID) == nullptr); pSocketObj->connTime = ::TimeGetTime(); pSocketObj->activeTime = pSocketObj->connTime; VERIFY(m_bfActiveSockets.ReleaseLock(dwConnID, pSocketObj)); }
BOOL CTcpServer::IsConnected(CONNID dwConnID) { TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TSocketObj::IsValid(pSocketObj)) return pSocketObj->HasConnected(); return FALSE; }
void CUdpServer::AddClientSocketObj(CONNID dwConnID, TUdpSocketObj* pSocketObj) { CReentrantWriteLock locallock(m_csClientSocket); ASSERT(FindSocketObj(dwConnID) == nullptr); pSocketObj->connTime = ::TimeGetTime(); m_mpClientSocket[dwConnID] = pSocketObj; m_mpClientAddr [&pSocketObj->clientAddr] = dwConnID; }
BOOL CUdpServer::Disconnect(CONNID dwConnID, BOOL bForce) { BOOL isOK = FALSE; TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TUdpSocketObj::IsValid(pSocketObj)) isOK = ::PostIocpDisconnect(m_hCompletePort, dwConnID); return isOK; }
void CUdpServer::ForceDisconnect(CONNID dwConnID) { TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(pSocketObj != nullptr) { FireClose(dwConnID); AddFreeSocketObj(dwConnID); } }
BOOL CUdpServer::Disconnect(CONNID dwConnID, BOOL bForce) { BOOL isOK = FALSE; TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TUdpSocketObj::IsValid(pSocketObj)) isOK = ::PostQueuedCompletionStatus(m_hCompletePort, IOCP_SI_DISCONNECT, dwConnID, nullptr); return isOK; }
BOOL CTcpServer::GetLocalAddress(CONNID dwConnID, TCHAR lpszAddress[], int& iAddressLen, USHORT& usPort) { ASSERT(lpszAddress != nullptr && iAddressLen > 0); TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TSocketObj::IsValid(pSocketObj)) return ::GetSocketLocalAddress(pSocketObj->socket, lpszAddress, iAddressLen, usPort); return FALSE; }
BOOL CTcpAgent::GetLocalAddress(CONNID dwConnID, LPTSTR lpszAddress, int& iAddressLen, USHORT& usPort) { ASSERT(lpszAddress != nullptr && iAddressLen > 0); TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TSocketObj::IsExist(pSocketObj)) return ::GetSocketLocalAddress(pSocketObj->socket, lpszAddress, iAddressLen, usPort); return FALSE; }
BOOL CIocpServer::GetConnectionAddress(DWORD dwConnID, CString& strAddress, USHORT& usPort) { TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(pSocketObj) { strAddress = CA2T(inet_ntoa(pSocketObj->clientAddr.sin_addr)); usPort = ntohs(pSocketObj->clientAddr.sin_port); } return pSocketObj != NULL; }
// // Function: RemoveSocketObjByHandle // // Description: // Remove the socket object structure from the list of objects that // matches the socket handle. // void RemoveSocketObjByHandle(SOCKET s) { SOCKET_OBJ *obj; obj = FindSocketObj(s); if (obj) { RemoveSocketObj(obj); } return; }
void CTcpServer::AddClientSocketObj(CONNID dwConnID, TSocketObj* pSocketObj, const HP_SOCKADDR& remoteAddr) { ASSERT(FindSocketObj(dwConnID) == nullptr); pSocketObj->connTime = ::TimeGetTime(); pSocketObj->activeTime = pSocketObj->connTime; remoteAddr.Copy(pSocketObj->remoteAddr); pSocketObj->SetConnected(); ENSURE(m_bfActiveSockets.ReleaseLock(dwConnID, pSocketObj)); }
BOOL CTcpServer::Disconnect(CONNID dwConnID, BOOL bForce) { TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(!TSocketObj::IsValid(pSocketObj)) { ::SetLastError(ERROR_OBJECT_NOT_FOUND); return FALSE; } return ::PostIocpDisconnect(m_hCompletePort, dwConnID); }
BOOL CTcpAgent::GetConnectPeriod(CONNID dwConnID, DWORD& dwPeriod) { BOOL isOK = TRUE; TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TSocketObj::IsExist(pSocketObj)) dwPeriod = GetTimeGap32(pSocketObj->connTime); else isOK = FALSE; return isOK; }
BOOL CTcpAgent::GetPendingDataLength(CONNID dwConnID, int& iPending) { TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TSocketObj::IsValid(pSocketObj)) { iPending = pSocketObj->Pending(); return TRUE; } return FALSE; }
BOOL CTcpAgent::SetConnectionExtra(CONNID dwConnID, PVOID pExtra) { TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TSocketObj::IsExist(pSocketObj)) { pSocketObj->extra = pExtra; return TRUE; } return FALSE; }
BOOL CUdpServer::SetConnectionExtra(CONNID dwConnID, PVOID pExtra) { TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(pSocketObj != nullptr) { pSocketObj->extra = pExtra; return TRUE; } return FALSE; }
BOOL CUdpServer::GetConnectPeriod(CONNID dwConnID, DWORD& dwPeriod) { BOOL isOK = TRUE; TUdpSocketObj* pSocketObj = FindSocketObj(dwConnID); if(pSocketObj != nullptr) dwPeriod = GetTimeGap32(pSocketObj->connTime); else isOK = FALSE; return isOK; }
BOOL CTcpServer::IsPauseReceive(CONNID dwConnID, BOOL& bPaused) { TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TSocketObj::IsValid(pSocketObj)) { bPaused = pSocketObj->paused; return TRUE; } return FALSE; }
BOOL CTcpAgent::GetConnectionExtra(CONNID dwConnID, PVOID* ppExtra) { ASSERT(ppExtra != nullptr); TSocketObj* pSocketObj = FindSocketObj(dwConnID); if(TSocketObj::IsExist(pSocketObj)) { *ppExtra = pSocketObj->extra; return TRUE; } return FALSE; }