我目前在使用boost :: asio时遇到困难,特别是在async_write操作中使用缓冲区时。

当我想写一个数据包时,我使用

async_write(sock_, boost::asio::buffer((char *)&t.getData(), sizeof(T)), boost::bind(&BoostTcpSocket::manageWrite, this, t, boost::asio::placeholders::error));


如果我尝试一次发送一个数据包,则效果很好。但是,如果我跟随async_write进行两次调用,它将向我发送第二个数据包两次。数据包的生命周期没有问题。

我认为问题出在缓冲区,我想拥有一个packetQueue缓冲区而不是一个数据包缓冲区。

我怎样才能做到这一点 ?
谢谢你的帮助

编辑:这是有关代码的更多信息:

下面是它的工作原理 :

int  BoostTcpSocket::manageWrite(Packet *t, const boost::system::error_code& error)
{
    if (!er)
        std::cout << "Success " << t.getData() << std::endl;
    else
        std::cout << "Error" << std::endl;
    // delete t;  => Packet LifeCycle isn't the problem here...
}

int main()
{
    boost::asio::ip::tcp::socket    sock_(io);
    sock_.connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("127.0.0.1", 8080));
    Packet *p = new Packet("data1");
    Packet *p2 = new Packet("data2");

  sock_.async_write(boost::asio::buffer((char *)&p->getData(), sizeof(Packet::data)), boost::bind(&BoostTcpSocket::manageWrite, this, p, boost::asio::placeholders::error));
  sock_.async_write(boost::asio::buffer((char *)&p2->getData(), sizeof(Packet::data)), boost::bind(&BoostTcpSocket::manageWrite, this, p2, boost::asio::placeholders::error));
io.run();
}


即使服务器端std :: cout的输出是Success data1 Success data2,该代码也向我发送了两次数据“ data2”。

编辑:显然我在其他地方做错了,因为它现在正在工作..谢谢大家的时间和帮助!

最佳答案

在整个异步操作中,&t.getData()中的数据必须保持完整。在收到带成功指示的BoostUdpSocket::manageWrite的呼叫之前,您不得覆盖那里的数据。

关于c++ - 带boost::async_write的boost::buffer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8279824/

10-09 05:22