int Base :: UnPackBaseMsg(const std::string & sBuffer, Header & oHeader, size_t & iBodyStartPos, size_t & iBodyLen) { uint16_t iHeaderLen = 0; memcpy(&iHeaderLen, sBuffer.data() + GROUPIDXLEN, HEADLEN_LEN); size_t iHeaderStartPos = GROUPIDXLEN + HEADLEN_LEN; iBodyStartPos = iHeaderStartPos + iHeaderLen; if (iBodyStartPos > sBuffer.size()) { BP->GetAlgorithmBaseBP()->UnPackHeaderLenTooLong(); NLErr("Header headerlen too loog %d", iHeaderLen); return -1; } bool bSucc = oHeader.ParseFromArray(sBuffer.data() + iHeaderStartPos, iHeaderLen); if (!bSucc) { NLErr("Header.ParseFromArray fail, skip this msg"); return -1; } NLDebug("buffer_size %zu header len %d cmdid %d gid %lu rid %lu version %d body_startpos %zu", sBuffer.size(), iHeaderLen, oHeader.cmdid(), oHeader.gid(), oHeader.rid(), oHeader.version(), iBodyStartPos); if (oHeader.version() >= 1) { if (iBodyStartPos + CHECKSUM_LEN > sBuffer.size()) { NLErr("no checksum, body start pos %zu buffersize %zu", iBodyStartPos, sBuffer.size()); return -1; } iBodyLen = sBuffer.size() - CHECKSUM_LEN - iBodyStartPos; uint32_t iBufferChecksum = 0; memcpy(&iBufferChecksum, sBuffer.data() + sBuffer.size() - CHECKSUM_LEN, CHECKSUM_LEN); uint32_t iNewCalBufferChecksum = crc32(0, (const uint8_t *)sBuffer.data(), sBuffer.size() - CHECKSUM_LEN, NET_CRC32SKIP); if (iNewCalBufferChecksum != iBufferChecksum) { BP->GetAlgorithmBaseBP()->UnPackChecksumNotSame(); NLErr("Data.bring.checksum %u not equal to Data.cal.checksum %u", iBufferChecksum, iNewCalBufferChecksum); return -1; } /* NLDebug("Checksum compare ok, Data.bring.checksum %u, Data.cal.checksum %u", iBufferChecksum, iNewCalBufferChecksum) */ } else { iBodyLen = sBuffer.size() - iBodyStartPos; } return 0; }
bool Battlenet::Session::ReadHeaderHandler() { Header header; if (!header.ParseFromArray(_headerBuffer.GetReadPointer(), _headerBuffer.GetActiveSize())) return false; _packetBuffer.Resize(header.size()); return true; }
void client::read_event() { try { char hdr_data[5]; read(hdr_data, 5); Header hdr; hdr.ParseFromArray(hdr_data, 5); size_t sz = hdr.size(); char msg_data[sz]; read(msg_data, sz); Command cmd; cmd.ParseFromArray(msg_data, sz); parse_command(cmd); } catch(finch::net::socket::disconnected_exception& e) { _serv->drop_client(this); } }
bool Battlenet::Session::ReadDataHandler() { Header header; ASSERT(header.ParseFromArray(_headerBuffer.GetReadPointer(), _headerBuffer.GetActiveSize())); if (header.service_id() != 0xFE) { sServiceDispatcher.Dispatch(this, header.service_hash(), header.token(), header.method_id(), std::move(_packetBuffer)); } else { auto itr = _responseCallbacks.find(header.token()); if (itr != _responseCallbacks.end()) { itr->second(std::move(_packetBuffer)); _responseCallbacks.erase(header.token()); } else _packetBuffer.Reset(); } return true; }