2011-11-26 78 views
0

我目前很難用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 ...

編輯:顯然我做錯了什麼地方因爲它現在正在工作..謝謝大家對你的時間&幫助!

+0

我認爲更多的代碼會有助於給你一些提示。例如。顯示我們manageWrite(..) – Simon

+0

p-> getData()返回什麼?爲什麼你需要演員?什麼是數據包? – Simon

+0

p是一個包含結構的類。即時通訊嘗試通過套接字發送的結構。 – Cuva

回答

2

在整個異步操作中,&t.getData()處的數據必須保持不變。在收到回撥給BoostUdpSocket::manageWrite的電話之前,您不能覆蓋那裏的數據並顯示成功信息。

+0

我不覆蓋它,t分配在堆上,之後我不再觸摸它。這與緩衝區大小沒有任何關係?由於它的大小隻是一個數據包的大小,如果我在第一個數據包未被髮送時再次調用async_write,它將被覆蓋? – Cuva

+0

你可以爲有問題的代碼顯示更多的上下文嗎? –

+0

這裏是我的文章的更新...是不是應該工作? – Cuva

0

您在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: 噢,我看到了 - 您在此期間修改了代碼。是否仍然存在運行時錯誤?

+0

對不起,我做了一個錯誤,當我做了例子...我改變了它。我已經檢查過,我的回調函數是用p來調用的,第二次用p2來調用。但它發送相同的數據包。我在刪除數據包方面沒有問題,但是使用boost :: asio發送的數據... – Cuva

+0

問題不在於刪除。我可以評論它。問題是網絡發送兩次第二個數據包,而不是第一個和第二個,或第二個和第一個...... – Cuva

相關問題