從網絡中斷中恢復我正在編寫一個接受來自設備的數據並對其進行處理的服務器。一切工作正常,除非網絡中斷(即,如果我拔掉以太網電纜,然後重新連接它)。我正在使用read_until(),因爲設備使用的協議會使用特定的字節序列來終止數據包。當數據流中斷時,read_until()按預期阻塞。但是,當流再次啓動時,它仍然被阻塞。如果我用Wireshark查看數據流,設備將繼續傳輸,並且每個數據包都由網絡堆棧確認。但是,如果我查看bytes_readable,它始終爲0.如何檢測中斷以及如何重新建立與數據流的連接?以下是代碼片段,並提前感謝您提供的任何幫助。 [進入容易對我來說,這是我的第一個堆棧溢出問題....是的,我曾嘗試尋找答案。]如何使用boost :: asio從網絡中斷中恢復如何使用boost :: asio
using boost::asio::ip::tcp;
boost::asio::io_service IOservice;
tcp::acceptor acceptor(IOservice, tcp::endpoint(tcp::v4(), listenPort));
tcp::socket socket(IOservice);
acceptor.accept(socket);
for (;;)
{
len = boost::asio::read_until(socket, sbuf, end);
// Process sbuf
// etc.
}
謝謝你的湯姆。但問題是,當我拔出插頭時,read_until()不會返回錯誤代碼。它只是阻止並永遠不會返回。 – Schnizz
現在想想,我想說這是有道理的。服務器(接收套接字)無法區分線路上的不活動狀態和非正常關閉連接。我會考慮在套接字上設置'SO_RCVTIMEO'或者在最後期限計時器周圍實現一個異步封裝來停止運行異步讀取的io_service。無論哪種方式,我會說你需要一個關於超時的外部信息。也就是說,我建議使用完全異步,爲傳入的,可接受的TCP連接創建多個「共享」套接字。 –
是的,我想知道是否完全異步可以解決問題。我會放棄這一點。感謝幫助。 – Schnizz