2013-07-01 66 views
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),我可以得到預期的結果。

爲什麼會發生這種情況?

回答

3

eof錯誤表示寫入方關閉了連接。之前發送的任何數據仍應在TcpServer::HandleRead回調中可用。檢查bytes_transferred參數以確定讀取器接收了多少數據。

+0

我找到了原因,如果我使用transfer_all,我需要使用具有固定大小的緩衝區,否則會發生錯誤,因爲async_read無法填滿緩衝區。 – user2538425

+0

發生錯誤是因爲流的末尾已達到(並且您請求繼續閱讀直到該事件) - 即。這並不是真正的失敗之處。它只是表示流的結束。數據仍然可供您使用。 –

相關問題