2016-08-11 3 views
2

Перед этим стоит следующая проблема. Я пытаюсь использовать стороннюю библиотеку с boost Asio, и мне нужно добавить некоторые дескрипторы сокетов, используемые библиотекой в ​​цикле событий io_service.Уничтожение Boost Asio сокет без закрытия встроенного обработчика

Подход, который я использую, создает boost :: asio :: ip :: tcp :: socket, передавая собственный обработчик, предоставляемый моей библиотекой.

Проблема в том, что библиотека просто сообщила, что ее не интересуют конкретные уведомления сокетов (это означает, что библиотека может закрыть сокет или повторно использовать его в более поздней точке). В любом случае, я хотел бы сделать очистку от сокетов повышения и уничтожить их, но не закрывая нативный обработчик (то есть дескриптор файла).

Короче говоря, есть ли способ уничтожить boost :: asio :: ip :: tcp :: socket без закрытия базового обработчика? Я знаю об использовании posix :: stream_descriptor вместо этого, но я хотел бы, чтобы мое решение было переносимым.

+0

Вы пытались [назначить] (http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/reference/basic_stream_socket/assign.html) немой сокет, даже если он не работает может быть предыдущим, будет недоступен ... –

+0

@JeanDavy 'socket.assign (protocol, native)' имеет предварительное условие, что 'socket' не открыто (см. [SocketService] (http: //www.boost .org/DOC/LIBS/1_61_0/DOC/HTML/boost_asio/ссылка/SocketService.html)). Если это условие не выполняется, состояние 'socket' остается неизменным. –

ответ

2

Нет. Нет способа уничтожить ip::tcp::socket, не закрывая нативный обработчик. Это не может быть переносимым, и поэтому Asio не поддерживает его. В частности, до Windows 8.1, когда сокет связан с портом завершения ввода-вывода, гнездо может быть отключено только путем его закрытия. . См this связанной проблемы GitHub, где Крис Kohlhoff реагирует на эту просьбу особенности:

Это не поддерживается, потому что она не может быть переносимым реализована. В частности, в Windows сокет связан с портом завершения ввода-вывода и не может быть отключен.

Если вы ориентируетесь только на системы на базе POSIX, возможно, вы можете вставить дескриптор в posix::stream_descriptor вместо этого? Этот класс предоставляет функцию члена release().


1. Окна 8.1 включена удаление порта завершения связи через FileReplaceCompletionInformation без закрытия сокета.

0

, но я хотел бы мое решение, чтобы быть портативным

В тот момент, вы касаетесь родной ручки, программа больше не переносимый.

Однако, как только вы с этим договорились, вы можете позвонить dup() [unix] или DuplicateHandle() [windows] на нативный дескриптор.

+0

На самом деле я не намерен касаться встроенного дескриптора, Asio и другая библиотека используют одни и те же родные дескрипторы как в windows, так и в unix. – sapito

0

Вы можете попробовать swtich до posix :: stream_descriptor и использовать его метод release.

Смежные вопросы