qicosmos / rest_rpc

modern C++(C++11), simple, easy to use rpc framework
MIT License
1.66k stars 365 forks source link

rpc异常导致程序崩溃 #131

Open chenjinle opened 4 months ago

chenjinle commented 4 months ago

程序异常时报错如下:

0 0xb6a0ee22 in rest_rpc::rpc_client::call_back(unsigned long long, boost::system::error_code const&, boost::basic_string_view<char, std::char_traits >) () from /mnt/data/hwt_rk3308/lib/libbtl.so

1 0xb6a139ca in boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffers_1, boost::asio::mutable_buffer const*, boost::asio::detail::transfer_all_t, rest_rpc::rpc_client::read_body(unsigned long long, rest_rpc::request_type, unsigned int)::{lambda(boost::system::error_code, unsigned int)#1}>::operator()(boost::system::error_code, unsigned int, int) () from /mnt/data/hwt_rk3308/lib/libbtl.so

2 0xb6a14950 in boost::asio::detail::reactive_socket_recv_op<boost::asio::mutable_buffers_1, boost::asio::detail::read_op<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::any_io_executor>, boost::asio::mutable_buffers_1, boost::asio::mutable_buffer const, boost::asio::detail::transfer_all_t, rest_rpc::rpc_client::read_body(unsigned long long, rest_rpc::request_type, unsigned int)::{lambda(boost::system::error_code, unsigned int)#1}>, boost::asio::any_io_executor>::do_complete(void, boost::asio::detail::scheduler_operation*, boost::system::error_code const&, unsigned int) ()

from /mnt/data/hwt_rk3308/lib/libbtl.so

3 0xb6a0c286 in boost::asio::detail::scheduler::run(boost::system::error_code&) () from /mnt/data/hwt_rk3308/lib/libbtl.so

4 0xb6a16df8 in std::thread::_State_impl<std::_Bind_simple<rest_rpc::rpc_client::rpc_client()::{lambda()#1} ()> >::_M_run() () from /mnt/data/hwt_rk3308/lib/libbtl.so

5 0xb69257a0 in ?? () from /usr/lib/libstdc++.so.6

6 0xb6a385ce in ?? () from /lib/libpthread.so.0

用法是在libbtl库中使用rpc创建客户端提供接口,另外有一个服务端,客户端接口代码如下: rest_rpc::rpc_client& getBoardRpcClient(const std::string &host, int port) { static rest_rpc::rpc_client m_rpcBoardClient; if (m_rpcBoardClient.has_connected()) { return m_rpcBoardClient; } m_rpcBoardClient.enable_auto_heartbeat(); // automatic heartbeat m_rpcBoardClient.connect(host, port, false, 60); // 60s return m_rpcBoardClient; }

int getKeyCodeStatus(const int nKeyCode, KEYVALUE &emKeyValue){

ifndef __NOREST_RPC

    rest_rpc::rpc_client &m_rpcClient = getBoardRpcClient();
    int nRetValue = 0;
    if (!m_rpcClient.has_connected()) {

        printf("Error:%s not connect\r\n", __FUNCTION__);
        return -2;
    }
    auto f = m_rpcClient.async_call<rest_rpc::FUTURE>("getKeyCodeStatus", nKeyCode);
    if (f.wait_for(std::chrono::milliseconds(5000)) ==
        std::future_status::timeout) {
        printf("Error: %s : call timeout, line: %d\n", __FUNCTION__, __LINE__);
        return -3;
    }
    nRetValue = f.get().as<int>();
    if(nRetValue < 0){
        return -4;
    }else{
        emKeyValue = (KEYVALUE)nRetValue;
        return 0;
    }
#else
    return 0;
#endif  
}
qicosmos commented 4 months ago

能提供一个完整的测试代码吗,包括服务端和客户端。

chenjinle commented 3 months ago

RPC.zip

chenjinle commented 3 months ago

这个是客户端和服务端的测试代码