2011-09-21 17 views
5

私が欲しいのは、シンプルです - ブーストasioソケットから新しいC++/CLI .Netソケットを作成するコードサンプルです。そのようなものを作る方法?ここでboost :: asioソケットをC++/CLI .NETソケットに変換する方法は?

は私がやりたいものの擬似コードです:

ところで
.net::socket a; 
boost::asio::socket b; 
a.assign(b.nativeWin32Socket()); 

:ここではあなたがBoost.ASIOソケットを「切り離す」ことができませんどのようにturn C++/CLI .Net socket into boost::asio socket.

+0

オプションではなく、(ラップされた)ソケットハンドルを受け取るコンストラクタはprivateです。 –

+2

@ HansPassant:はい、[this one](http://msdn.microsoft.com/en-us/library/ms145125.aspx)は公開されています。警告:電池は含まれていません。 –

答えて

8

です。 native_handle()メンバ関数を使用してasio::socketオブジェクトから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/両方の抽象概念が2つの異なるハンドルを介して同じソケットを共有できるように、ms741565(v = VS.85).aspx)。 –

+0

Boost実装は、SOCKETハンドルをI/O完了ポートに関連付けます。私はこのソケットを安全に複製することは考えていません。もしあなたが100%他のコードが2番目のI/O完了ポートにそれを関連づけようとする可能性がないなら、 2.0 .NETソケットクラスは、非同期操作のために内部的にIOCPを使用していますが、それはそれ以降のバージョンで変更されている可能性があります。 –

3

WSADuplicateSocket()によって返されたPROTOCOL_INFO構造体を使用し、それをSocketInformationに変換してappropriate socket constructorを使用して、別のハンドルの共有ソケットを取得できます。

WSADuplicateSocket()のドキュメントの「備考」セクションには、ソケットの複製に関わる通常の制御フローが示されています。私はこの流れがSocketInformation Socket::DuplicateAndClose()Socket(SocketInformation)コールのペアと幾分同等であると思う。

関連する問題