2016-08-11 63 views
2

我正面臨以下問題。我想用boost Asio使用第三方庫,我需要在io_service事件循環中注入一些庫使用的套接字描述符。銷燬Boost Asio套接字而不關閉本地處理程序

我使用的方法是創建一個boost :: asio :: ip :: tcp :: socket傳遞我的庫提供的本機處理程序。

問題是,庫只是傳達它對特定的套接字通知不感興趣(這意味着庫可能會關閉套接字或稍後重新使用它)。無論如何,我想要清理boost套接字並銷燬它們,但不關閉本地處理程序(即文件描述符)。

總之,有沒有什麼辦法可以在不關閉底層處理程序的情況下銷燬boost :: asio :: ip :: tcp :: socket?我知道使用posix :: stream_descriptor,但我希望我的解決方案是可移植的。

+0

你是否嘗試[指定](http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/basic_stream_socket/assign.html)一個愚蠢的套接字,即使它失敗了可能以前沒有更多的可用... –

+0

@JeanDavy'socket.assign(protocol,native)'有一個先決條件,即'socket'沒有打開(參見[SocketService](http://www.boost .ORG/DOC /庫/ 1_61_0/DOC/HTML/boost_asio /參考/ SocketService.html))。如果這個前提條件不滿足,那麼'socket'的狀態保持不變。 –

回答

2

否。沒有關閉ip::tcp::socket而不關閉本機處理程序的方法。這不能被實施,因此Asio不支持它。特別是,在Windows 8.1之前,一旦套接字與I/O完成端口相關聯,則只能通過關閉套接字來解除關聯套接字的連接。見this相關GitHub的問題,即克里斯Kohlhoff響應此功能要求:

,因爲它不能被可移植性付諸實施。這是不支持的。具體而言,在Windows上,套接字與I/O完成端口關聯,不能解除關聯。

如果你只是針對基於POSIX的系統,那麼也許你可以將描述符粘貼到posix::stream_descriptor而不是?此課程確實提供了一個release()成員函數。


1. Windows 8.1中啓用,但不關閉插座移除通過FileReplaceCompletionInformation完成端口關聯。

0

,但我想我的解決方案是便攜式

你觸摸本機柄的那一刻,該程序不再移動。

但是,一旦您接觸到這個問題,您可以在本地句柄上調用dup() [unix]或DuplicateHandle() [windows]。

+0

實際上,我不打算觸摸本地句柄,Asio和其他庫都在windows和unix中都使用同一種本地句柄。 – sapito

0

您可以嘗試撥打posix :: stream_descriptor並使用其release方法。

相關問題