我很新的boost :: asio,我遇到了一個問題,我真的不知道如何解決,請問您可以請幫我。boost :: asio read - 返回所有數據從套接字讀取,而不等待EOF
一般來說,我試圖實現基於boost :: asio的代理服務器。我使用async_read_some功能從服務器讀取響應,這樣的事情:
_ssocket.async_read_some(boost::asio::buffer(_sbuffer),
boost::bind(&connection::handle_server_read_body_some,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
));
一切都很好,它讀取一些數據串和呼叫處理程序。問題在於當我調用async_read_some函數時 - 並且沒有更多數據要從套接字讀取。所以處理程序不需要大約15秒 - 直到EOF將被驅散。 (所以服務器套接字斷開)。我已經嘗試了不同的讀取函數,並且它們都只在1或mote字節讀取或出現錯誤時才返回。
事情是,有時我不知道我需要讀多少字節 - 所以我只需要閱讀所有內容。我試圖用
boost::asio::socket_base::bytes_readable
或
_ssocket.available(err)
要figgure了多少字節的插座avaliable,但問題是,這些函數會返回一個可以無阻塞地讀取的字節數,這樣我就可以不要以我的實現爲基礎,即使是從測試中看到,有時,bytes_readable返回0,然後在同一個套接字上調用async_read_some,讀取大量數據。
我的問題是有沒有什麼辦法來獲得亞胺化返回(在同步調用的情況下)/處理程序調用(在異步的情況下),當沒有更多的數據從套接字讀取?因爲目前它只持續15秒直到EOF。
我會appriciate任何意見或提示,你可以給我。
我認爲你面對的TCP/IP,這裏的基本面。除了遠程套接字告訴它(即EOF)時,套接字如何知道什麼時候沒有更多的數據要讀取? – Nick
使用流式套接字(如TCP)不可能知道,因爲它是流式傳輸。像TCP連接這樣的網絡流就像現實生活中的一個流,數據從一端流向另一端,而結束流的唯一方法是切斷連接。如果你想要消息邊界,那麼要麼將它們添加到你的協議中(要麼使用包含消息邊界的協議),要麼使用UDP。 –
嗯......但你認爲需要10-15秒才能說出來嗎?我的意思是,是的,我同意你的觀點,並期望遠程套接字在沒有更多數據存在的情況下可以通知,但是這個延遲有點太長,你不這麼認爲嗎? – miks131