问题
I've two classes (Negotiator, Client), both has their own boost::asio::ip::tcp::socket. Is there a way to transfer socket object to Client after negotiation is finished. I'm looking forward to do something like that:
boost::asio::ip::tcp::socket sock1(io);
//...
boost::asio::ip::tcp::socket sock2;
sock2.assign(sock1);
This operation must guarantee that the connection won't be closed when sock1 is destroyed.
回答1:
I think that you could:
- obtain sock1's native handle with the native() member function
- dup() (or WSADuplicateSocket()) sock1's native handle
- pass the dup()-ed handle to sock2 with the assing() member function
However:
- I'm not sure as I never tried that
- If you want to transfer (instead of sharing) the socket from Negotiator to Client, Dan's suggestion of using dynamic allocation is probably simpler, using unique_ptr (or auto_ptr)
回答2:
Create the socket on the heap (new), and pass the pointer from the negotiator to the client.
回答3:
As of the current version of Boost, you would now get the handle with
boost::asio::ip::tcp::socket::my_socket;
auto my_handle = my_socket.native_handle();
instead of the old native()
member function.
来源:https://stackoverflow.com/questions/2966323/boostasio-and-socket-ownership