2
我已經編寫了一個使用boost:asio庫的程序,它在2個tcp服務器之間傳輸數據。 一臺服務器使用下面的代碼來發送數據:boost :: asio :: async_read獲取文件錯誤結尾
std::shared_ptr<std::string> s =
std::make_shared<std::string>(message);
boost::asio::async_write(socket_, boost::asio::buffer(*s),
std::bind(&TcpServer::HandleWrite, shared_from_this(), s, _1, _2));
在另一個TCPSERVER,當我使用async_read_until得到的數據,一切工作正常,但如果我更換async_read_until到async_read,它提供了一個End Of File
錯誤:
boost::asio::streambuf input_buffer;
boost::asio::async_read_until(socket_, input_buffer, match_condition(),
std::bind(&TcpServer::HandleRead, shared_from_this(), _1));
//boost::asio::async_read(socket_, input_buffer, boost::asio::transfer_all(),
// std::bind(&TcpServer::HandleRead, shared_from_this(), _1));
如果我在async_read中使用boost::asio::transfer_at_least(1)
,我可以得到預期的結果。
爲什麼會發生這種情況?
我找到了原因,如果我使用transfer_all,我需要使用具有固定大小的緩衝區,否則會發生錯誤,因爲async_read無法填滿緩衝區。 – user2538425
發生錯誤是因爲流的末尾已達到(並且您請求繼續閱讀直到該事件) - 即。這並不是真正的失敗之處。它只是表示流的結束。數據仍然可供您使用。 –