boost::asio and socket ownership

半城伤御伤魂 提交于 2019-12-10 17:53:19

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!