![](/img/trans.png)
[英]boost::asio::streambuf::consume - Injects garbage character
[英]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.