void CSocketClient::OnReceive(int nErrorCode) { // TODO: Add your specialized code here and/or call the base class // TODO: 通知客户端接到消息了 m_nLength=Receive(m_yBuffer,sizeof(m_yBuffer),0); // 解析数据包 CMemoryBuffer memoryBuffer(m_yBuffer, sizeof(m_yBuffer)); CSerializer arc; if(!arc.BeginReading(&memoryBuffer, false)) { OutputDebugString(_T("ClientSocket: 网络包解析失败!")); return; } WORD wMsgID = -1; // 循环取信息 while(1) { arc >> wMsgID; // 通知网络层收到消息 [11/22/2010 Kaiming-Laptop] if( !this->OnMsgFromServer(wMsgID, arc) ) break; } // 收到信息以后就清空 m_nLength=0; memset(m_yBuffer,0,sizeof(m_yBuffer)); //AsyncSelect(FD_READ); CSocket::OnReceive(nErrorCode); }
virtual void readLoop() { if (mRange.goesToEndOfFile()) { if (mDiskSize > 0) { mRange.setLength(mDiskSize - mRange.startbyte(), true); } else { aborted(); return; } } MutableDenseDataPtr memoryBuffer(new DenseData(mRange)); if (!read_full(mFd, memoryBuffer->writableData(), mRange.length())) { aborted(); return; } mCallback(memoryBuffer, true, mDiskSize); }