Is it possible to detach a native socket from Boost.ASIO\'s socket class? If so, how can it be done? I can\'t seem to find anything obvious in the documentation.
As
Answering my own question.
Windows has a WSADuplicateSocket function, which can be used to duplicate the native socket. The underlying socket will remain open until all descriptors for this socket are deallocated.
http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx
For Mac OS X do the following (for Linux it isn't hard to modify, just notice the very idea):
shared_ptr
, so that it won't close when passing into different routines and keep it alive (at least one reference should always exist);socket.native();
Remove it from kqueue:
struct kevent event;
EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); //or EVFILT_WRITE
And make it blocking if needed:
fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFL, 0) & ~O_NONBLOCK);