qicosmos / rest_rpc

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

疑似在set_network_err_callback中调度get_user_data抛出异常 #148

Closed shfxxer closed 1 week ago

shfxxer commented 1 week ago

目前流程是这样:我需要在一个新client连接时分配部分资源,并且在连接断开后清理这些资源

但是在set_network_err_callback中调度get_user_data抛出异常如下: terminate called after throwing an instance of 'nonstd::any_lite::bad_any_cast'

最小复现代码如下: visual studio 2022 or gcc 9 rest_rpc 0.12

//==============================client=======================================

include \<iostream>

include \<rest_rpc.hpp>

int main() { rest_rpc::rpc_client NetClient("127.0.0.1", 19000); NetClient.connect(); std::cout << "Hello World!\n"; NetClient.close(); }

//================================server=========================================

include

include

void CloseConn(std::shared_ptr\<rest_rpc::rpc_service::connection> conn, std::string reason) { conn->set_user_data(100); try { auto k = conn->get_user_data\<long>(); } catch (...) { printf("exception!\n"); } }

int main() { rest_rpc::rpc_service::rpc_server SrvObj(19000, 10000); SrvObj.set_network_err_callback(CloseConn); std::cout << "Hello World!\n"; SrvObj.run(); } //================================end==========================================

程序会在conn->get_user_data();一行抛出exception,但是set_user_data(100);没有问题。 这个流程与client connect后立即disconnect无关,中间有业务也会崩

qicosmos commented 1 week ago

看起来是类型不匹配,设置时候是int,取值的时候按long去取,按int取值应该就可以了。