所以我有一個使用io_service::poll()
處理任何目前準備讀一個服務方法/寫事件:檢測在Windows中使用boost :: ASIO插座收盤
void Foo::service()
{
io.poll(); // boost::asio::io_service
if (socket.is_open())
if (socket.available())
notifyReadyToRead();
else
notifyReadyToWrite();
}
不過,我也想觸發行爲如果遠程套接字關閉(優雅地或以其他方式)。我知道Winsock可以處理這個問題,因爲它在這種情況下引發了網絡事件。然而,就我所見,Boost Asio插座沒有內置的支持。
我試過讀寫套接字的零字節數據包來測試它的錯誤,但是看起來,如果你通過boost::asio::buffer(socket, 0)
而不實際檢查套接字,它實現簡單地成功保存。
我還聽說,留下一個掛讀操作可以工作,但我不知道如何管理這同時仍然允許定期boost::asio::read
和「的boost :: ASIO :: write`操作才能正常工作。
最後,添加ping操作到應用程序級協議是一個沒有去;這個類的目的是一般使用,即使它不是我不能改變遠程端的協議。
雖然我寧願一個便攜式解決方案,Windows的特定解決方案就足夠了,即使這意味着抓住了原生手柄和枚舉事件的方式。 (這發生在我身上,但WSAEnumNetworkEvents
清除了事件的內部記錄,所以我懷疑如果boost :: asio實現依賴於讀取它會導致問題。)
有在任何操作系統爲該變爲靜默不可用/不可達遠程套接字的通知不支持 - 協議不且不能支持它。 –