boost :: buffer :: async_write
问题描述:
我目前很难用boost :: asio,特别是async_write操作中的缓冲区。boost :: buffer :: 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是成功data1成功data2 ...
编辑:显然我做错了什么地方因为它现在正在工作..谢谢大家对你的时间&帮助!
答
您在async_write(..)回调函数中绑定了两次* p。这导致双删除!
见的boost ::绑定(...,* P,...)
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, *p, boost::asio::placeholders::error));
顺便说一句:如果你wannt传递* P为基准,考虑使用boost :: REF(..)或boost :: cref(..)。
编辑: 双删除是,我认为,不是你的问题,但传递* p没有boost :: ref(..)是问题 - 因为你删除了一个不是堆分配的对象(因为它是一个副本!)。
EDIT2: 噢,我看到了 - 您在此期间修改了代码。是否仍然存在运行时错误?
我认为更多的代码会有助于给你一些提示。例如。显示我们manageWrite(..) – Simon
p-> getData()返回什么?为什么你需要演员?什么是数据包? – Simon
p是一个包含结构的类。即时通讯尝试通过套接字发送的结构。 – Cuva