使用boost asio区分客户端

时间:2016-03-22 16:26:19

标签: c++ udp boost-asio

如何使用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仍未填充。

我该如何处理?

1 个答案:

答案 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来简化(不太喜欢)