31 votes

La conversion d'une ressource de socket dans un flux de socket

PHP dispose de deux différents Api pour interagir avec des sockets. Il est le faible niveau de l'API socket qui, fondamentalement, enveloppe le C API socket. Et il y a un niveau élevé de flux de sockets API, qui met en œuvre le PHP interface de flux.

Malheureusement, le flux d'API socket ne prend pas en charge le réglage de faible niveau d'options de prise. Cependant, ce est quelque chose que j'ai à faire. De même, l'API socket ne prend pas en charge l'utilisation de la fonction de base des appels comme fread, fwrite et fclose, ce qui la rend incompatible avec le reste de mon code.

PHP 5.4 introduit la socket_import_stream fonction. Cela permet de prendre un socket de flux et d'obtenir le sous-jacent ressource de socket. Mon plan était de l'utiliser pour créer le socket de flux, d'obtenir la prise, mettre quelques options sur elle, et puis continuer à utiliser le flux d'origine socket.

La raison pour laquelle cela ne fonctionne pas pour moi, c'est que j'ai besoin de configurer les options avant de liaison. La seule façon de se lier à un socket de flux consiste à utiliser stream_socket_server, qui a déjà effectue la liaison. C'est pourquoi je ne pouvais pas l'utiliser.

Je suis maintenant à la recherche de l'inverse d' socket_import_stream, de sorte que je peux convertir mes ressource de socket dans un flux de support. Je n'ai pas été en mesure de trouver une telle fonction, mais je suis en espérant que certaines personnes très intelligentes qui peuvent m'aider. Ou de soumettre un patch à la source en PHP qui le fait. Ou me donner des conseils sur la rédaction d'un tel patch.

EDIT: j'ai un code qui agit sur un PHP stream analyser des paquets DNS de lui. Je veux réutiliser le code avec une multidiffusion à douille. Je ne peut pas activer le multicast sur un socket de flux, et je ne peut pas utiliser les fonctions flux sur une socket raw.

EDIT2: je veux utiliser ce flux, stream_select, de manière personnalisée, les gestionnaires de flux ne sont pas une option, malheureusement.

6voto

james_t Points 1528

Vous pouvez utiliser le stream_wrapper_register fonction en combinaison avec une classe qui implémente l' streamWrapper modèle pour créer un multidiffusion socket stream. Cela vous permettra de bénéficier de toutes les construit dans les fonctions flux, si elle n'est pas aussi pratique que socket_export_stream.

5voto

pozs Points 6034

La raison pour laquelle cela ne fonctionne pas pour moi, c'est que j'ai besoin de configurer les options avant de liaison. La seule façon de se lier à un socket de flux consiste à utiliser stream_socket_server, qui a déjà effectue la liaison. C'est pourquoi je ne pouvais pas l'utiliser.

Le 4ème paramètre de stream_socket_server() est $flags, qui par défaut est STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, il ne faut pas omettre, donner des 0 (ou un autre des drapeaux).

Après tout réglage est terminé, vous pouvez toujours manuellement bind (et écouter) que le socket en utilisant l' socket_bind() & socket_listen().

Je n'ai pas essayé, juste une idée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X