Подтвердить что ты не робот

Преобразование ресурса сокета в сокет потока

PHP имеет два разных API для взаимодействия с сокетами. Существует API-интерфейс сокетов низкого уровня, который в основном обертывает API-интерфейс сокета. И есть API-интерфейсы потоков высокого уровня потока, которые реализуют интерфейс потока PHP.

К сожалению, API сокета потока не поддерживает установку параметров сокета низкого уровня. Однако это то, что я должен сделать. Аналогично, API сокета не поддерживает использование стандартных вызовов функций, таких как fread, fwrite и fclose, что делает его несовместимым с остальной частью моего кода.

В PHP 5.4 была введена функция socket_import_stream. Это позволяет вам взять сокет потока и получить основной ресурс сокета. Мой план состоял в том, чтобы использовать это для создания сокета потока, получить сокет, установить на нем некоторые параметры, а затем продолжить использование исходного сокета потока.

Причина, по которой это не помогло мне, заключается в том, что мне нужно установить параметры перед привязкой. Единственный способ привязать потоковый сокет - использовать stream_socket_server, который уже выполняет привязку. Вот почему я не мог его использовать.

Теперь я ищу инверсию socket_import_stream, чтобы я мог преобразовать свой ресурс сокета в сокет потока. Я не смог найти такую ​​функцию, но я надеюсь, что некоторые очень умные люди могут мне помочь. Или подайте патч к источнику PHP, который это делает. Или дайте мне подсказки о написании такого патча.

EDIT: У меня есть код, который действует на поток PHP для анализа DNS-пакетов из него. Я хочу повторно использовать этот код с поддержкой многоадресной рассылки. Я не могу включить многоадресную рассылку в поточном сокете, и я не могу использовать потоковые функции в сыром сокете.

EDIT2: Я хочу использовать этот поток с stream_select, поэтому пользовательские потоковые обертки, к сожалению, не являются опцией.

4b9b3361

Ответ 1

Вы можете использовать функцию stream_wrapper_register в сочетании с классом, который реализует шаблон streamWrapper, чтобы создать поток многоадресного сокета. Это позволит вам использовать все встроенные функции потока, хотя это не так удобно, как socket_export_stream.

Ответ 2

Причина, по которой это не помогло мне, заключается в том, что мне нужно установить параметры перед привязкой. Единственный способ связать сокет потока - использовать stream_socket_server, который уже выполняет привязку. Вот почему я не мог его использовать.

4-й параметр stream_socket_server() - $flags, который по умолчанию равен STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, поэтому не опускайте его, дайте 0 (или другие флаги).

После того, как все настройки выполнены, вы можете вручную привязать (& listen) к этому сокету с помощью socket_bind() и socket_listen().

Я не пробовал, просто идея.