socket servidor salida resource por flujos enviar entrada datos cliente php sockets stream

php - servidor - Convertir un recurso de socket en un socket de flujo



sockets php cliente servidor (2)

La razón por la que esto no funcionó para mí es que necesito establecer las opciones antes de enlazar. La única forma de vincular un socket de flujo es usar stream_socket_server, que ya realiza el enlace. Es por eso que no pude usarlo.

El 4º parámetro de stream_socket_server() es $flags , que por defecto es STREAM_SERVER_BIND | STREAM_SERVER_LISTEN STREAM_SERVER_BIND | STREAM_SERVER_LISTEN , así que no lo omitas, da 0 (u otros indicadores).

Una vez completada la configuración, puede enlazar (y escuchar) manualmente ese socket utilizando socket_bind() y socket_listen() .

No lo intenté, solo una idea.

PHP tiene dos API diferentes para interactuar con sockets. Existe la API de bajo nivel de socket que básicamente envuelve la API de socket C. Y está la API de sockets de flujo de alto nivel, que implementa la interfaz de flujo de PHP.

Desafortunadamente, la API de socket de flujo no admite la configuración de opciones de socket de bajo nivel. Sin embargo, esto es algo que tengo que hacer. Del mismo modo, la API de socket no admite el uso de llamadas a funciones estándar como fread , fwrite y fclose , por lo que es incompatible con el resto de mi código.

PHP 5.4 introdujo la función socket_import_stream . Esto le permite tomar un socket de flujo y obtener el recurso socket subyacente. Mi plan era usar esto para crear el socket de flujo, obtener el socket, establecer algunas opciones en él y luego continuar usando el socket de flujo original.

La razón por la que esto no funcionó para mí es que necesito establecer las opciones antes de enlazar. La única forma de vincular un socket de flujo es usar stream_socket_server , que ya realiza el enlace. Es por eso que no pude usarlo.

Ahora estoy buscando el inverso de socket_import_stream , de modo que pueda convertir mi recurso de socket en un socket de flujo. No he podido encontrar esa función, pero espero que algunas personas muy inteligentes puedan ayudarme. O envíe un parche a la fuente PHP que lo hace. O dame pistas sobre cómo escribir un parche.

EDITAR: Tengo un código que actúa en una secuencia PHP para analizar los paquetes DNS desde allí. Quiero volver a utilizar ese código con un socket habilitado para multidifusión. No puedo habilitar la multidifusión en un socket de flujo, y no puedo usar las funciones de flujo en un socket sin procesar.

EDIT2: Quiero usar esta secuencia con stream_select , por lo que desafortunadamente, las envolturas de flujo personalizadas no son una opción.


Puede utilizar la función stream_wrapper_register en combinación con una clase que implementa la plantilla streamWrapper para crear una secuencia de socket de multidifusión. Esto le permitirá aprovechar todas las funciones de flujo integradas, aunque no es tan conveniente como socket_export_stream.