我目前很難用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 ...
編輯:顯然我做錯了什麼地方因爲它現在正在工作..謝謝大家對你的時間&幫助!
我認爲更多的代碼會有助於給你一些提示。例如。顯示我們manageWrite(..) – Simon
p-> getData()返回什麼?爲什麼你需要演員?什麼是數據包? – Simon
p是一個包含結構的類。即時通訊嘗試通過套接字發送的結構。 – Cuva