2012-10-25 46 views
2

所以我有一個使用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實現依賴於讀取它會導致問題。)

+1

有在任何操作系統爲該變爲靜默不可用/不可達遠程套接字的通知不支持 - 協議不且不能支持它。 –

回答

0

在一般情況下,您必須實現一些基於應用程序的操作,檢測各種斷線的高級機制。 關於此主題的boost/asio ML有很多討論,here is on of them

0

您可以啓用套接字選項TCP_KEEPALIVE,但仍需以接收讀取失敗的通知掛起的讀操作。