Отсоединение собственного сокета от класса сокетов Boost.ASIO - PullRequest
6 голосов
/ 11 января 2010

Можно ли отсоединить собственный сокет от класса сокетов Boost.ASIO? Если так, как это можно сделать? Кажется, я не могу найти ничего очевидного в документации.

В качестве краткого обзора того, что я пытаюсь выполнить: у меня есть класс, который устанавливает соединение и выполняет некоторые согласования, используя Boost.ASIO, а затем возвращает исходную Windows SOCKET в случае успеха или 0 в случае ошибки.

Если я не ошибаюсь, родной сокет будет закрыт и освобожден при разрушении моего boost :: asio :: basic_socket.

Ответы [ 2 ]

2 голосов
/ 11 января 2010

Отвечая на мой вопрос.

Windows имеет функцию WSADuplicateSocket, которую можно использовать для дублирования собственного сокета. Базовый сокет будет оставаться открытым, пока все дескрипторы для этого сокета не будут освобождены.

http://msdn.microsoft.com/en-us/library/ms741565(VS.85).aspx

0 голосов
/ 14 июля 2010

Для Mac OS X сделайте следующее (для Linux это не сложно изменить, просто обратите внимание на саму идею):

  1. Обернуть сокет в shared_ptr, чтобы он не закрывался при переходе в разные подпрограммы и оставлял его живым (должна существовать хотя бы одна ссылка);
  2. Получить собственный дескриптор с socket.native();
  3. Удалить его из очереди:

    struct kevent event;
    EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0);  //or EVFILT_WRITE
    
  4. И заблокировать его при необходимости:

    fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFL, 0) & ~O_NONBLOCK);
    
...