【发布时间】:2021-07-24 07:45:13
【问题描述】:
我正在尝试通过连接握手传递一个套接字,并使用std::bind 这样做。我遇到的编译问题(在一个连续的块中,为了便于阅读,我添加了空格)是:
'std::_Bind<_Functor(_Bound_args ...)>::_Bind(_Functor&&, _Args&& ...)
[with _Args = {socket_state**, std::function<void(socket_state*)>&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::executor>&, boost::asio::io_context&};
_Functor = void (*)(socket_state*, std::function<void(socket_state*)>&, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&, boost::asio::io_context&);
_Bound_args = {socket_state**, std::function<void(socket_state*)>, boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::executor>, boost::asio::io_context}]':
我的代码在下面,错误似乎在boost::asio::acceptor.async_accept(socket, ...) 的std::bind 参数和accept_new_client 方法的参数中唠叨
void start_server(std::function<void(socket_state*)>& func, tcp::acceptor& acceptor, boost::asio::io_context& context)
{
acceptor.listen();
// Start client connection loop
networking::wait_for_client(func, acceptor, context);
}
void wait_for_client(std::function<void(socket_state*)>& func, tcp::acceptor& acceptor, boost::asio::io_context& context)
{
boost::asio::ip::tcp::socket socket(context);
// socket_state is its own class which links a particular socket with an ID and buffer data
// it also holds a function to indicate which part of the connection handshake it needs to go to next
socket_state* state = new socket_state(func, &socket);
acceptor.async_accept(socket, std::bind(&networking::accept_new_client, state, func, acceptor, context));
}
void accept_new_client(socket_state* state, std::function<void(socket_state*)>& func, tcp::acceptor& acceptor, boost::asio::io_context& context)
{
state->on_network_action(state);
wait_for_client(func, acceptor, context);
}
看起来它们会匹配,但您可以看到错误状态我的std::bind 参数是socket_state** 而不是socket_state*,以及boost::asio::basic_socket_acceptor<boost::asio::ip::tcp, boost::asio::executor>& 而不是boost::asio::basic_socket_acceptor<boost::asio::ip::tcp>&。
我也不知道“with _Args”与“_Bound_args”是什么。
【问题讨论】:
-
在堆上分配的结构中存储指向局部变量
socket的指针非常可疑。一旦wait_for_client返回,该局部变量将被销毁,留下socket_state一个悬空指针。 -
错误消息表明您将
socket_state**(两颗星)传递给std::bind,而您绑定的函数需要socket_state*(一颗星)。错误信息与显示的代码不匹配;它必须与您实际编译的代码不同。 -
我很困惑,因为确切的代码 sn-p 是正在编译的。我对 sn-p 进行了更改(例如在一些 std::bind 参数后面添加 & )并且它更改了错误消息,因此它必须直接指向我正在编译的代码。也将存储智能指针而不是移动?
-
准确完整的错误信息是什么?您只展示了其中的一部分 - 缺少的是编译器说出它认为错误的实际消息。我对
boost::asio不熟悉,但是quick glance 似乎暗示回调应该采用const boost::system::error_code& error参数;你的没有。也许这就是错误的根源。 -
@sehe
networking是一个命名空间,用作 server.cpp 类使用的抽象。 @IgorTandetnik 完整的错误是数百行;我发布的 sn-p 是第一部分,似乎可能是其他所有内容的根源。无论如何,现在在 sehe 的帮助下解决了。感谢您在这里的讨论,很有见地!
标签: c++ c++11 boost network-programming boost-asio