c++ - Boost.Asio async_send 问题

标签 c++ boost-asio

我将 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/

相关文章:

c++ - Boost Asio 不完整写入套接字

networking - websocket 是否保证单个消息的完整性?我应该为 websocket 消息实现我自己的 header 吗?

c++ - SIGINT 正常关闭

c++ - 错误 : redefinition of 'class TextDocsCmpr'

轻量级 Web 服务器的 C++ 兼容性

c++ - 如何在 C++11 中将 unix 时间戳字符串正确转换为 time_t?

c++ - Graham Scan C++无法正常工作

c++ - 来自 `boost::asio::streambuf`

linux - 使用 boost ASIO 配置串口

c++ - 直接将数组写入参数会在 C++ 中出错