boost :: asio и владение сокетом - PullRequest
3 голосов
/ 03 июня 2010

У меня есть два класса (Negotiator, Client), оба имеют свой собственный boost :: asio :: ip :: tcp :: socket. Есть ли способ передать объект сокета клиенту после завершения переговоров. Я с нетерпением жду, чтобы сделать что-то подобное:

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

Эта операция должна гарантировать, что соединение не будет закрыто при разрушении sock1.

Ответы [ 3 ]

2 голосов
/ 03 июня 2010

I думаю , что вы могли бы:

  • получить собственный дескриптор sock1 с помощью функции-члена native ()
  • dup () (или WSADuplicateSocket ())Родной дескриптор sock1
  • передает дескриптор dup () - ed в sock2 с помощью функции-члена assing ()

Однако:

  • Я неконечно, поскольку я никогда не пытался это сделать
  • Если вы хотите передать (вместо совместного использования) сокета из Negotiator в Client, предложение Дэна об использовании динамического выделения, вероятно, проще, используя unique_ptr (или auto_ptr))
2 голосов
/ 03 июня 2010

Создайте сокет в куче (новый) и передайте указатель от посредника клиенту.

0 голосов
/ 13 февраля 2018

Начиная с текущей версии Boost, вы теперь получите дескриптор с

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

вместо старой native() функции-члена.

...