我经常在代码中看到这种模式,绑定shared_from_this为成员函数的第一个参数,并使用async_*函数调度结果.以下是另一个问题的示例:
void Connection::Receive()
{
boost::asio::async_read(socket_,boost::asio::buffer(this->read_buffer_),
boost::bind(&Connection::handle_Receive,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
Run Code Online (Sandbox Code Playgroud)
使用shared_from_this()而不是使用的唯一原因this是在调用成员函数之前保持对象存活.但除非在某处有某种类型的增强魔法,因为this指针是类型的Connection*,所有都handle_Receive可以,并且返回的智能指针应该立即转换为常规指针.如果发生这种情况,那么没有任何东西可以让对象保持活力.当然,在呼叫中没有指针shared_from_this.
但是,我经常看到这种模式,我不敢相信它在我看来完全被打破了.当操作完成时,是否有一些Boost魔法会导致shared_ptr转换为常规指针?如果是这样,这是在某处记录的吗?
特别是,在某个地方记录共享指针将保持存在直到操作完成?调用get_pointer强指针然后在返回的指针上调用成员函数是不够的,除非强指针在成员函数返回之前不被销毁.
我在boost doc中看到了官方的异步udp服务器示例.在那里你创建一个单独的udp套接字,将它绑定到本地端口并执行以下操作:
socket(ioService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port))
socket.async_receive_from(buffer(data, max_length), senderEndpoint, boost::bind(&Request::HandleReceiveFrom, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
Run Code Online (Sandbox Code Playgroud)
如何处理来自客户端的多个并发udp连接,因为如果我尝试使用创建另一个套接字
socket(ioService, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), port))
Run Code Online (Sandbox Code Playgroud)
我得到绑定错误,因为我已经有一个绑定到同一端口的套接字.
编辑 我可以使用不同的服务器源端口向客户端发回响应,但即使我将响应发送回相同的客户端IP /客户端目标端口,它们也无法识别响应.