void CTcpPullClient::DoFetch(BYTE* pBuffer, int iLength) { int iIndex = 0; int iRemain = iLength; while(iRemain > 0) { CBufferPtr* pItem = m_pullBuffers->front(); int iItemSize = (int)pItem->Size(); int iCopySize = min(iItemSize, iRemain); memcpy(pBuffer + iIndex, pItem->Ptr(), iCopySize); if(iItemSize > iRemain) { int iLeft = iItemSize - iCopySize; memcpy(pItem->Ptr(), pItem->Ptr() + iCopySize, iLeft); pItem->Realloc(iLeft); } else { m_pullBuffers->pop_front(); delete pItem; } iRemain -= iCopySize; iIndex += iCopySize; } }
BOOL CClientSocket::DoSendData(CBufferPtr& sndData) { while(sndData.Size() > 0) { int rc = send(m_soClient, (char*)(BYTE*)sndData, min((int)sndData.Size(), (int)m_dwSocketBufferSize), 0); if(rc > 0) { if(FireSend(m_dwConnID, sndData, rc) == ISocketListener::HR_ERROR) { TRACE1("<CNNID: %Iu> OnSend() event should not return 'HR_ERROR' !!\n", m_dwConnID); ASSERT(FALSE); } int left = (int)sndData.Size() - rc; memcpy((BYTE*)sndData, (BYTE*)sndData + rc, left); sndData.Realloc(left); } else if(rc == SOCKET_ERROR) { int code = ::WSAGetLastError(); if(code == WSAEWOULDBLOCK) break; else { SetLastError(ISC_NETWORK_ERROR, _T(__FUNCTION__), code); FireError(m_dwConnID, SO_SEND, code); return FALSE; } } else ASSERT(FALSE); } return TRUE; }