2011-09-21 47 views
5

我想要的是簡單 - 從boost asio套接字創建新的C++/CLI .Net套接字的代碼示例。如何創建這樣的事情?如何將boost :: asio套接字轉換爲C++/CLI .Net套接字?

這裏是我想要做什麼僞代碼:

.net::socket a; 
boost::asio::socket b; 
a.assign(b.nativeWin32Socket()); 

BTW:這裏是如何turn C++/CLI .Net socket into boost::asio socket.

+0

不是一種選擇,採用(包裹的)套接字句柄的構造函數是私有的。 –

+2

@HansPassant:是的,但[這一個](http://msdn.microsoft.com/en-us/library/ms145125.aspx)是公開的。警告:不包括電池。 –

回答

8

你不能「分離」一個Boost.Asio的插座。您可以使用native_handle()成員函數從asio::socket對象獲取SOCKET句柄,但必須確保asio::socket對象不會被破壞,直到完成SOCKET。它繼續擁有本地SOCKET的所有權,並在調用析構函數時關閉它。

與André建議的一樣,您可以複製套接字句柄。但是,我不會考慮重複此套接字安全,因爲Boost.ASIO自動將本地SOCKET句柄與I/O完成端口相關聯。如果.NET套接字封裝器或其他代碼嘗試將複製的套接字與不同的I/O完成端口相關聯,則會發生錯誤。實際上,我知道.NET 2.0套接字類將SOCKET句柄與用於異步操作的I/O完成端口關聯起來。但是,這可能在更新版本中發生了變化。

+2

或者使用['WSADuplicateSocket'](http://msdn.microsoft.com/en-us/library/ms741565(v = VS.85).aspx),那麼當Boost關閉句柄時它並不重要,有一個獨立的句柄來保持它打開的同一個套接字。 (假設Boost調用'closesocket'而不是'shutdown') –

+0

即使你不能分離套接字,你仍然可以[複製套接字句柄](http://msdn.microsoft.com/en-us/library/ ms741565(v = VS.85).aspx),以便兩個抽象可以通過兩個不同的句柄共享相同的套接字。 –

+0

Boost實現將SOCKET句柄與I/O完成端口相關聯。我不會考慮重複這個套接字的安全,除非你100%確定沒有其他代碼嘗試將它與第二個I/O完成端口關聯的機會;我知道2.0 .NET Socket類在內部使用IOCP進行異步操作,儘管在後續版本中可能會有所變化。 –

相關問題