gpt4 book ai didi

c++ - boost::buffer 和 boost::async_write

转载 作者:行者123 更新时间:2023-11-28 03:43:56 26 4
gpt4 key购买 nike

我目前在使用 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();
}

这段代码基本上向我发送了两次数据“data2”,即使服务器端 std::cout 的输出是 Success data1 Success data2...

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

最佳答案

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com