簡體   English   中英

從客戶端收到所有數據后,提升asio streambuf垃圾

[英]boost asio streambuf garbage after all data received from client

我正在寫一個小的boost asio tcp服務器和客戶端,用於發送和接收純文本。 通訊或多或少是請求響應。 在測試期間,我發現我只是向服務器發送數據垃圾郵件,向其發送100.000個請求。

從客戶端發送到服務器的消息:

\\ n =開始1,測試\\ n
你好世界:1
\\ N = END \\ n

在上面的消息中,計數器從0到99.999(在上面的示例中,計數器為1,如“ BEGIN 1”和“ Hello World:1”中一樣)。

如前所述,這很好,服務器可以接收所有100.000條消息,但是一旦全部傳輸完,盡管沒有從客戶端發送數據,但讀取處理程序的調用次數可能會高出數倍。

從streambuf對象讀取數據會產生較舊消息的殘余,如下所示:

IN 61868,測試\\ n
你好世界:61868
\\ N = END \\ n

和:

= END \\ n
= END \\ n

奇怪的是,它似乎僅在消息數量超過一定數量時才會發生,但是並不一致,這使我相信某個地方存在溢出或UB,因此我顯然做錯了事,但是我似乎無法弄清楚是什么。 讀取的代碼是:

 typedef boost::shared_ptr<boost::asio::streambuf>       asio_streambuf_ptr;
 typedef boost::shared_ptr<boost::asio::ip::tcp::socket> asio_socket_ptr;

 ...

 void on_read(const asio_socket_ptr& s, const asio_streambuf_ptr& b,
     const boost_error_code& e, size_t length) {

   if ( !e ) {

       std::string temp(boost::asio::buffer_cast<const char*>(b->data()), length);
       //process temp

       b->consume(length);
   } else {
       //Handle the error - or close the socket if disconnected
       handle_error(s, e);
   }

   read(s, b);
 }

 void read(const asio_socket_ptr& s, const asio_streambuf_ptr& buf) {

     if (s->is_open()) {
       boost::asio::async_read_until(*s, *buf, "\n=END\n",
           boost::bind(on_read, s, buf, boost::asio::placeholders::error,
             boost::asio::placeholders::bytes_transferred));
     }
 }

我的on_read函數的第一個實現使用std :: istream和std :: getline逐行讀取每個消息,但是這里也存在問題,並且由於很難在gdb中檢查流,因此我將其重寫以使其更容易研究。

現在,我必須強調,我是Boost-asio的新手,這是我第一次嘗試對boost的這一部分做出有用的事情,因此,我確實接受我很可能會誤解異步io系統的幾個概念。 。

所以我的問題是:有沒有人以前經歷過或者對我做錯了什么建議?

我已經創建了SSCCE,但是由於涉及服務器和客戶端的大量代碼,我想我將等待將其發布到此處,直到有人提出要求為止。

更新:問題似乎是客戶端寫入消息的速度比服務器讀取消息的速度快。 限制客戶端稍微解決了該問題。 注意:更改內部緩沖區的大小無濟於事,因此客戶端似乎淹沒了一些os-network緩沖區或達到此目的的東西。

如果出現錯誤,則不應繼續閱讀->僅在未檢測到錯誤的情況下。 也許您在EOF之后繼續閱讀? 移動調用以讀取if中的函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM