我将 Boost.Asio 用于我正在编写的服务器应用程序。
async_send
要求调用方保留对正在发送的数据的所有权,直到数据发送成功。这意味着我的代码(如下所示)将失败,而且确实如此,因为 data
将不再是有效对象。
void func()
{
std::vector<unsigned char> data;
// ...
// fill data with stuff
// ...
socket.async_send(boost::asio::buffer(data), handler);
}
所以我的解决方案是做这样的事情:
std::vector<unsigned char> data;
void func()
{
// ...
// fill data with stuff
// ...
socket.async_send(boost::asio::buffer(data), handler)
}
但现在我想知道如果我有多个客户端,是否需要为每个连接创建一个单独的 vector ?
或者我可以使用那个单一的载体吗?如果我能够使用该单一 vector ,如果我覆盖其中的内容,是否会弄乱我发送给所有客户的数据?
最佳答案
一个可能的解决方法是使用 shared_ptr
来保存本地 vector
并更改处理程序的签名以接收 shared_ptr
以便延长data
的生命周期,直到发送完成(感谢 Tim 向我指出这一点):
void handler( boost::shared_ptr<std::vector<char> > data )
{
}
void func()
{
boost::shared_ptr<std::vector<char> > data(new std::vector<char>);
// ...
// fill data with stuff
// ...
socket.async_send(boost::asio::buffer(*data), boost:bind(handler,data));
}
关于c++ - Boost.Asio async_send 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5344809/