void CCNetDelegate::close() { if( m_eStatus == eSocketConnected ) { unregisterScheduler(); m_oSocket.ccClose(); m_eStatus = eSocketIoClosed; onDisconnected(); } }
void CNetDelegate::disconnect() { if( m_eStatus == eSocketConnected ) { unregisterScheduler(); m_oSocket.ccDisconnect(); m_eStatus = eSocketDisconnected; onDisconnected(); } }
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::runSchedule(float dt) { switch( m_eStatus ) { case eSocketConnecting: { switch( m_oSocket.ccIsConnected() ) { case eSocketConnected: { m_eStatus = eSocketConnected; onConnected(); } break; case eSocketConnectFailed: { unregisterScheduler(); m_oSocket.ccClose(); m_eStatus = eSocketConnectFailed; onExceptionCaught(eSocketConnectFailed); } break; case eSocketConnecting: { if( m_fConnectingDuration > m_fSoTimeout ) { unregisterScheduler(); m_oSocket.ccDisconnect(); m_eStatus = eSocketDisconnected; onConnectTimeout(); m_fConnectingDuration = 0.0f; } else { m_fConnectingDuration += dt; } } break; default: break; } } break; case eSocketConnected: { #if HANDLE_ON_SINGLE_FRAME while( m_oSocket.ccIsReadable() ) #else if( m_oSocket.ccIsReadable() ) #endif { if( this->runRead() ) return; } #if HANDLE_ON_SINGLE_FRAME while( m_oSocket.ccIsWritable() && !m_lSendBuffers.empty() ) #else if( m_oSocket.ccIsWritable() && !m_lSendBuffers.empty() ) #endif { if( this->runWrite() ) return; } } break; default: break; } }
bool CCNetDelegate::runReadByte() { int nRet = m_oSocket.ccRead(m_pReadBuffer + m_wRecvSize, sizeof(m_pReadBuffer) - m_wRecvSize); 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_wRecvSize += nRet; BYTE cbDataBuffer[SOCKET_BUFFER+sizeof(CMD_Head)]; WORD wPacketSize = 0; CMD_Head * pHead = (CMD_Head *)m_pReadBuffer; while( m_wRecvSize >= sizeof(CMD_Head) ) { //效验参数 wPacketSize = pHead->CmdInfo.wPacketSize; // ASSERT(pHead->CmdInfo.cbVersion == SOCKET_VER); // ASSERT(wPacketSize <= (SOCKET_BUFFER + sizeof(CMD_Head))); if (pHead->CmdInfo.cbVersion != SOCKET_VER) throw std::string("数据包版本错误"); if (wPacketSize > (SOCKET_BUFFER + sizeof(CMD_Head))) throw std::string("数据包太大"); if (m_wRecvSize < wPacketSize) return 1; //拷贝数据 m_dwRecvPacketCount++; memcpy(cbDataBuffer, m_pReadBuffer, wPacketSize); m_wRecvSize -= wPacketSize; memcpy(m_pReadBuffer, m_pReadBuffer + wPacketSize, m_wRecvSize); //解密数据 WORD wRealySize=CrevasseBuffer(cbDataBuffer,wPacketSize); //解释数据 WORD wDataSize = wRealySize - sizeof(CMD_Head); void * pDataBuffer = cbDataBuffer + sizeof(CMD_Head); CMD_Command Command = ((CMD_Head *)cbDataBuffer)->CommandInfo; //内核命令 if (Command.wMainCmdID == MDM_KN_COMMAND) { switch (Command.wSubCmdID) { case SUB_KN_DETECT_SOCKET: //网络检测 { //发送数据 sendPacket(MDM_KN_COMMAND, SUB_KN_DETECT_SOCKET, pDataBuffer, wDataSize); break; } } continue; } //处理数据 // bool bSuccess = m_pITCPSocketSink->OnEventTCPSocketRead(GetSocketID(), Command, pDataBuffer, wDataSize); // if (bSuccess == false) throw std::string("网络数据包处理失败"); onMessageReceived((const char *)cbDataBuffer, wRealySize); } } return false; }