2011-06-20 90 views
3

boost::asio::placeholders::bytes_transferredasync_read_until()中是什麼意思?在回調函數中,它會返回比streambuf.size()更小的值。在回調之前,streambuf已經清楚。綜上所述,... bytes_transferred不是實際通過套接字的字節數,而是更少。我是否誤解了所有這些,或者是什麼?boost :: asio ::佔位符:: bytes_transferred是什麼意思

編輯:我從插座閱讀以下協議:

Y43,72,0,,91009802000000603=0000000000000000000

"Y43," - 是首部。
"Y" - 是消息類型。
"43" - 要讀取的附加字節
"," - 分隔符。標題是直到遇到第一個「,」。

我的代碼是用於閱讀是這樣的:

void handle_write(const boost::system::error_code& error, 
        size_t bytes_transferred) 
{ 
    if (!error) 
    { 
     boost::asio::async_read_until(
      socket_, 
      inputStreamBuffer_, 
      ',', 
      boost::bind(
       &client::handle_read1, this, 
       boost::asio::placeholders::error, 
       boost::asio::placeholders::bytes_transferred 
      ) 
     ); 
    } 
    else 
    { 
     std::cout << "Write failed: " << error << "\n"; 
    } 
} 

void handle_read1(const boost::system::error_code& error, 
        size_t bytes_transferred) 
{ 
    cout << "bytes_transferred=" << bytes_transferred << endl; 

    if (!error) 
    { 
     cout << "0 size=" << inputStreamBuffer_.size() << endl; 
     istream is(&inputStreamBuffer_); 
     char c[1000]; 
     is.read(c,bytes_transferred); 
     c[bytes_transferred]=0; 
     for (int i=0;i<bytes_transferred;++i) 
     { 
      cout << dec << "c[" << i << "]=" << c[i] << " hex=" << hex << static_cast<int>(c[i]) << "#" << endl; 
     } 
    } 
    else 
    { 
     std::cout << "Read failed: " << error << "\n"; 
    } 
} 

對於來自對方發送數據流:

Y43,71,0,,91009802000000595=0000000000000000000

有些時候,我讀了這一點:

bytes_transferred=4
0 size=47
c[0]=Y hex=59#
c[1]=4 hex=34#
c[2]=3 hex=33#
c[3]=, hex=2c#

對於從對方發送的流:

Y43,72,0,,91009802000000603=0000000000000000000

但其他時候,我讀了這一點:

bytes_transferred=7
0 size=47
c[0]= hex=0#
c[1]= hex=0#
c[2]= hex=0#
c[3]= hex=0#
c[4]=7 hex=37#
c[5]=2 hex=32#
c[6]=, hex=2c#

插座固定用SSL和客戶端和服務器應用程序稍微修改從boost_asio /示例/ SSL/*例子。

在第二個例子中,我失去了整個頭部:(

回答

3

已解決。當從服務器發送答覆時,我將std::string對象傳遞給boost::asio::buffer(),而不是std::string.c_str()

比你們都!

4

有功能四個重載,但我們只是假設第一個被使用。如果你看一下documentation,然後你會看到bytes_transferred是。字節的數量和包括指定的分隔

進而:

成功async_read_until操作之後,流緩衝可以包含附加數據以外的定界符的應用程序通常將離開。 streambuf中的數據用於隨後的async_read_until操作進行檢查。

0

正如文檔所示,您應該能夠忽略bytes_transferred之外的任何內容,並且只需再次調用async_read_until即可。但是如果你碰巧在ASIO 1.5.3中使用了全新的SSL實現(這還沒有正式成爲boost的一部分),那麼你可能遇到同樣的問題(我提交了一個補丁) :

http://comments.gmane.org/gmane.comp.lib.boost.asio.user/4803

它看起來並不像你所使用的新版本或運行到同樣的問題,但它的東西要知道,如果你擊出了一些限制和的優勢被誘惑新實現:

新的實現n編譯速度更快,性能顯着提高,並支持自定義內存分配和處理程序調用。它包括新的API功能,如證書驗證回調,並改進了錯誤報告。新的實現與大多數用途的老版本是源兼容的。

+0

感謝您的回覆,但我認爲我遇到了其他問題。 有時,直到第一個分隔符爲止的緩衝區內容被清零,所以我有效地丟失了數據包的標題。不過,這是隨機行爲。 –