如何使用boost.asio和UDP区分客户端,其中所有boost示例使用成员变量一次保存一个远程端点。我需要保存一个端点列表,并确定在到达时将接收到的数据发送到哪个对象。我目前有这样的代码
void Receive() {
boost::asio::ip::udp::endpoint client_endpoint;
char data[32];
socket_.async_receive_from(boost::asio::buffer(data, 32), client_endpoint,
boost::bind(&MyClass::onReceive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
}
但是client_endpoint
将超出处理函数中的范围(不可用),如果这是我第一次收到它,我想创建一个新的Client
对象,或者更新相应的客户端对象(如果不是。)
我在考虑将std::set<boost::ip::udp::endpoint> client_sessions_;
作为成员变量保存到我的服务器,但在调度异步调用之前,client_endpoint
仍未填充。
我该如何处理?
答案 0 :(得分:1)
您可以将端点保存在shared_ptr中。此外,你有asio :: buffer的错误 - async_receive_from将写入已经退出的函数堆栈,可能会破坏堆栈。正确的片段应该是这样的:
void Receive() {
auto client_endpoint = std::make_shared<boost::asio::ip::udp::endpoint>();
std::shared_ptr<char> data(new char[32], std::default_delete<char[]>());
socket_.async_receive_from(boost::asio::buffer(data.get(), 32), *client_endpoint,
boost::bind(&MyClass::onReceive, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, data, client_endpoint));
}
//...
void MyClass::onReceive(boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, std::shared_ptr<char> data, std::shared_ptr<boost::asio::ip::udp::endpoint> client_endpoint);
或者你可以使用new / delete来简化(不太喜欢)