Действительно ли возможно отсоединить собственный сокет от Повышения. Класс сокета ASIO? Если так, как это может быть сделано? Я, может казаться, ничто не нахожу очевидным в документации.
Как быстрый обзор того, что я пытаюсь выполнить: у Меня есть класс, который устанавливает связь и делает некоторое согласование с помощью Повышения. ASIO, затем пасует назад собственный Windows SOCKET на успехе или 0 при отказе.
Если я не ошибусь, собственный сокет будет закрыт и освобожден когда мое повышение:: asio:: basic_socket разрушен.
Отвечая на мой вопрос.
Windows имеет функцию WSADUPLATESOCESOCESOCES, которая может быть использована для дублирования собственного розетки. Основная розетка останется открытым до тех пор, пока все дескрипторы для этого розетки не будут отделены.
http://msdn.microsoft.com/en-us/library/ms741565 (vs.85) .aspx
Для Mac OS X сделайте следующее (для Linux это не сложно модифицировать, просто обратите внимание на саму идею):
shared_ptr
, чтобы он не закрывался при переходе в различные процедуры и поддерживайте его живым (по крайней мере одна ссылка должна всегда существовать);socket. native();
Удалите его из kqueue:
struct kevent event;
EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0, 0); //или EVFILT_WRITE
И сделать его блокирующим, если нужно:
fcntl(descriptor, F_SETFL, fcntl(descriptor, F_GETFL, 0) & ~O_NONBLOCK);