Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
    }
}