void ConnectionHandler::onPacketArrive(const base::packet::Header& header, base::packet::Packet& body, const SockAddr& clientaddr) { LOG(trace, "packet arrive: " << header << ", addr=" << addr()); rpc::Body msgbody; if (header.body_size()) { if (body.isFlat()) { iovec iov; body.getDirectPtr(&iov); if (!msgbody.ParseFromArray(iov.iov_base, iov.iov_len)) { LOG(error, "parse error!" << header << ", body=" << body); return; } } else { internal::PacketInputStream packetinput(body); ::google::protobuf::io::CodedInputStream in(&packetinput); if (!msgbody.ParseFromCodedStream(&in)) { LOG(error, "parse error!" << header << ", body=" << body); return; } } } onMessage(static_cast<rpc::OP>(header.op()), *msgbody.mutable_msgs(), clientaddr); }
void C2SHandler::onPacketArrive(const base::packet::Header& header, base::packet::Packet& body) { LOG(trace) << "c2s packet arrive: " << header << ENDL; try { PacketInputStream packetinput(body); ::google::protobuf::io::CodedInputStream in(&packetinput); auto_ptr<rpc::MessageBody> mb(new rpc::MessageBody); if (!mb->ParseFromCodedStream(&in)) THROW_RPC_CALL_EXCEPTION(rpc::EC_RPC_PARSE_ERROR, "parse error!"); if (scheduler_) { scheduler_->invokeStub(boost::static_pointer_cast<C2SHandler>(this->shared_from_this()), mb); } } catch (exception& e) { LOG(error) << EXCEPTION_DIAG_INFO(e); } }