Отсоединение собственного сокета от Повышения. Класс сокета ASIO

Действительно ли возможно отсоединить собственный сокет от Повышения. Класс сокета ASIO? Если так, как это может быть сделано? Я, может казаться, ничто не нахожу очевидным в документации.

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

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

6
задан NmdMystery 11 January 2014 в 19:55
поделиться

2 ответа

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

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

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

2
ответ дан 17 December 2019 в 20:32
поделиться

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

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

    struct kevent event;
    EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0, 0); //или EVFILT_WRITE
    
  4. И сделать его блокирующим, если нужно:

    fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFL, 0) & ~O_NONBLOCK);
    
0
ответ дан 17 December 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: