2010-06-03 6 views
3

J'ai deux classes (Négociateur, Client), les deux ont leur propre boost :: asio :: ip :: tcp :: socket. Existe-t-il un moyen de transférer l'objet socket au client après la fin de la négociation? Je suis impatient de faire quelque chose comme ça:boost :: propriété asio et socket

boost::asio::ip::tcp::socket sock1(io); 
//... 
boost::asio::ip::tcp::socket sock2; 
sock2.assign(sock1); 

Cette opération doit garantir que la connexion ne sera pas fermée lorsque sock1 est détruit.

Répondre

2

Je pense que vous pouvez:

  • obtenir poignée native de sock1 avec le natif() fonction membre
  • dup() (ou WSADuplicateSocket()) poignée native de sock1
  • passer le dup() -ed poignée à sock2 avec la fonction d'élément de Assing()

Cependant:

  • Je ne suis pas sûr que je ne ai jamais essayé
  • Si vous voulez transfert (au lieu de partager) la prise du Négociateur au client, la suggestion de Dan d'utiliser l'allocation dynamique est probablement plus simple, en utilisant unique_ptr (ou auto_ptr)
2

Créez le socket sur le tas (nouveau) et passez le pointeur du négociateur au client.

+0

Cela n'aide pas dans le cas de l'acceptation d'un socket TCP ordinaire, puis de le transformer en socket ssl. Ensuite, vous devez vraiment retirer la douille interne du premier et la coller dans la seconde. – Arvid

0

A partir de la version actuelle de Boost, vous maintenant obtenir la poignée avec

boost::asio::ip::tcp::socket::my_socket; 
auto my_handle = my_socket.native_handle(); 

au lieu de l'ancienne fonction de membre native().

Questions connexes