bool CCNetDelegate::runRead() { int nRet = m_oSocket.ccRead(m_pReadBuffer, SOCKET_READ_BUFFER_SIZE); if( nRet == eSocketIoError || nRet == eSocketIoClosed ) { unregisterScheduler(); m_oSocket.ccClose(); m_eStatus = eSocketIoClosed; onDisconnected(); return true; } else { #if 1 CCLOG("CCSOCKET READ %d", nRet); #endif m_oReadBuffer.writeData(m_pReadBuffer, (unsigned int)nRet); #if USING_PACKAGE_HEAD_LENGTH while( m_oReadBuffer.isReadable(sizeof(int)) ) { m_oReadBuffer.moveReaderIndexToFront(); int n_head_len = m_oReadBuffer.readInt(); if( n_head_len <= 0 ) { CCLOGERROR("invalidate head length"); m_oReadBuffer.moveLeft(sizeof(int)); } int n_content_len = (int)m_oReadBuffer.length(); if( n_content_len - (int)(sizeof(int)) >= n_head_len ) { m_oReadBuffer.moveLeft(sizeof(unsigned int)); CCBuffer* pData = m_oReadBuffer.readData(n_head_len); m_oReadBuffer.moveLeft(n_head_len); m_oReadBuffer.moveReaderIndexToFront(); m_oReadBuffer.moveWriterIndexToBack(); onMessageReceived(*pData); } else { break; } } #else CCBuffer* pData = (CCBuffer*) m_oReadBuffer.copy(); pData->autorelease(); m_oReadBuffer.clear(); onMessageReceived(*pData); #endif } return false; }
void CCNetDelegate::send(char* pBuffer, unsigned int uLen) { if( !pBuffer || uLen == 0 || !isConnected() ) return; #if USING_PACKAGE_HEAD_LENGTH CCBuffer* pBuf = new CCBuffer(pBuffer, uLen); pBuf->autorelease(); send(pBuf); #else char* pTemp = new char[uLen]; memcpy(pTemp, pBuffer, uLen); _SENDBUFFER tBuf; tBuf.pBuffer = pTemp; tBuf.nLength = (int)uLen; tBuf.nOffset = 0; m_lSendBuffers.push_back(tBuf); #endif }