6

Boost.ASIOのソケットクラスからネイティブソケットをデタッチすることは可能ですか?もしそうなら、それはどのように行うことができますか?ドキュメントに明らかなものが見つからないようです。

私が達成しようとしていることの簡単な概要として:接続を確立し、Boost.ASIOを使用してネゴシエーションを行い、成功した場合はネイティブWindows SOCKETを、失敗した場合は0を返すクラスがあります。

私が間違っていない限り、boost :: asio :: basic_socketが破棄されると、ネイティブソケットは閉じられ、割り当てが解除されます。

4

2 に答える 2

2

私自身の質問に答えます。

WindowsにはWSADuplicateSocket関数があり、これを使用してネイティブソケットを複製できます。基になるソケットは、このソケットのすべての記述子の割り当てが解除されるまで開いたままになります。

http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx

于 2010-01-11T18:34:40.863 に答える
0

Mac OS Xの場合は、次のようにします(Linuxの場合、変更するのは難しくありません。アイデアそのものに注意してください)。

  1. ソケットをでラップしてshared_ptr、別のルーチンに渡したときにソケットが閉じないようにし、それを存続させます(少なくとも1つの参照が常に存在する必要があります)。
  2. でネイティブ記述子を取得するsocket.native();
  3. kqueueから削除します。

    struct kevent event;
    EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0);  //or EVFILT_WRITE
    
  4. そして、必要に応じてブロックします。

    fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFL, 0) & ~O_NONBLOCK);
    
于 2010-07-14T18:06:16.957 に答える