int CAppCtrl::RecvData(unsigned int uiDPKey, CBuffer& stBuff) { //找到key对应的管道 PCShmQ pstShm = GetShm(uiDPKey); if(pstShm == NULL) { SL_ERROR("shm %u fand fails!", uiDPKey); return -1; } else if(!pstShm->HasCode()) { //管道里没有数据 return 0; } m_Stat.Put(app_stat_recvpkg); stBuff.Clear(); int iCodeLen = 0; //从管道里取出一个code int iRet = pstShm->GetOneCode(stBuff.GetFreeBuf(), stBuff.GetFreeLen(), iCodeLen); if(iRet || iCodeLen < (int)sizeof(CNetHead)) { SL_ERROR("get one code but data fails (ret: %d, clen:%d)",iRet, iCodeLen); return -2; } stBuff.Append(iCodeLen); return iCodeLen; }
// If compiled script, make sure correct chunkname is embedded void CLuaShared::EmbedChunkName(SString strChunkName, const char** pcpOutBuffer, uint* puiOutSize) { const char*& cpBuffer = *pcpOutBuffer; uint& uiSize = *puiOutSize; if (!IsLuaCompiledScript(cpBuffer, uiSize)) return; if (uiSize < 12) return; // Get size of name in original uint uiStringSizeOrig = *(uint*)(cpBuffer + 12); if (uiSize < 12 + 4 + uiStringSizeOrig) return; static CBuffer store; store.Clear(); CBufferWriteStream stream(store); // Ensure name starts with @ and ends with NULL if (!strChunkName.BeginsWith("@")) strChunkName = "@" + strChunkName; if (strChunkName[strChunkName.length() - 1] != '\0') strChunkName.push_back('\0'); // Header stream.WriteBytes(cpBuffer, 12); // New name size stream.Write(strChunkName.length()); // New name bytes incl zero termination stream.WriteBytes(strChunkName.c_str(), strChunkName.length()); // And the rest stream.WriteBytes(cpBuffer + 12 + 4 + uiStringSizeOrig, uiSize - 12 - 4 - uiStringSizeOrig); cpBuffer = store.GetData(); uiSize = store.GetSize(); }