socket_stream_select: Attendre un flux (stream) et un socket en même temps

Avec PHP, on peut interagir avec l’extérieur (et l’intérieur) du serveur sur lequel est exécuté le PHP à l’aide de flux et de sockets. Pour PHP, les flux – ou streams – et les sockets sont différents, alors qu’au niveau système, ce sont en réalité tous les deux des sockets (différents des sockets tels que l’entend PHP).

L’on travaille sur les deux en utilisant des fonctions toutes distinctes:

Parmi celles-ci, il y a deux fonctions extrêmement utiles: stream_select et socket_select. Elles permettent d’attendre de nouvelles données respectivement depuis un flux et un socket.

Vous pouvez par exemple attendre deux flux de données en même temps avec stream_select. Si l’un des deux a de nouvelles informations, la fonction retourne un entier décrivant le nombre de flux qui ont eu de nouvelles notifications. Vous pouvez aussi ajouter un timeout, etc… De la même manière, vous pouvez attendre un ou plusieurs sockets avec socket_select.

Seulement, si vous travaillez à la fois avec des flux et des sockets… Comment faire?

  1. Vous pouvez très bien mettre des timeout à quelques dizaines de millisecondes, regarder pendant x ms le flux, x ms le socket, puis on recommence… C’est une solution comme une autre mais très peu propre, et qui ne sera jamais “instantanée”.
  2. Vous pouvez utiliser un système, auquel vous vous connecterez en socket, qui écoutera un flux et dès que le flux recevra des données, il vous l’enverra par le socket. Ainsi, vous aurez que des sockets, vous pouvez donc utiliser socket_select.
  3. Mais, pourquoi ne pas créer une fonction socket_stream_select, ou stream_socket_select, comme vous voulez, dans le coeur de PHP, qui transformera les flux et les sockets PHP en sockets systèmes pour les écouter avec la fonction C select ?

Continue reading socket_stream_select: Attendre un flux (stream) et un socket en même temps

facebooktwittergoogle_plusredditpinterestlinkedinmail

ActionScript: Socket.writeUTFBytes ne marche pas

Pendant de nombreuses heures, j’ai chercher à faire marcher les Sockets d’ActionScript. Ceux-ci ne marchaient pas, alors que le policyfile était chargé, il y a avait même un socket policy file server de mis en place, et le policyfile.txt ne m’affichais que des résultats positifs. Encore plus impressionnant, le socket créait une connexion mais les différentes commandes que je souhaitait envoyer ne passaient pas… C’est pourquoi, au bout d’un moment, j’ai utiliser Wireshark pour analyser les différents paquets envoyés. C’est avec celui-ci que j’ai pu voir que uniquement des paquets ACK et SYN étaient envoyés entre le client (via le Flash) et le serveur (socket). Ceux-ci étaient responsables de la connexion établie.

Seulement, les paquets réseau PSH (pour Push) qui envoient les commandes n’étaient pas créés, pas même de paquets déformés contenant mes commandes. Je suis sur Ubuntu 64bits, avec un Flash Player 10, version débuguage 32bits. Donc, un petit essai sur Ubuntu 32bits avec le flash player “basique”, et… miracle, ça marche ! Windows XP, ça marche !

En fait, mon code marchait depuis longtemps mais, pas de bol, ma version du Flash Player est bugguée avec les Sockets… Par conséquent, lorsqu’il se passe des choses comme ça, essayez avec d’autres versions, d’autres environnement car il arrive que se ne soit pas votre application qui soit bugguée mais une autre ! 😉

facebooktwittergoogle_plusredditpinterestlinkedinmail

Sockets avec Flash: Un serveur pour les “master socket policy file”

Depuis la version 9,0,125 de Flash Player, toutes les connexions à l’aide de Sockets font objet de mesures de sécurité supplémentaires. Dorénavant n’importe quelle connexion utilisant les Sockets devront être explicitement autorisées par le serveur vers lequel la connexion Socket s’effectuera pour le serveur hôte du ficher SWF. C’est-à-dire que, par exemple, si vous hébergez votre fichier Flash (.swf) sur le domaine static.example.com et que la connexion se fait sur le port XX du serveur socks.examples.com, alors il faudra créer un socket sur le port 843 qui retournera le fichier de sécurité (de la même forme de les crossdomain.xml que l’on connait pour les URLs), appelé le “master socket policy file”.

Cette contrainte est apparue depuis la version 9 de Flash Player, et est néanmoins moins restrictives sur ces versions car l’on peut utiliser les Security.loadPolicyFile() pour charger des fichiers de sécurité pour les sockets, alors que dans les versions 10, il faudra un “master policy file”.

C’est pourquoi, il faut dès à présent mieux d’implanter cette fonctionnalité sur votre serveur en créant simplement un petit deamon sur le port 843 qui retournera le fichier de sécurité lors de la requête <policy-file-request/> suivie d’un caractère NULL. Si vous souhaitez créer votre propre “master socket policy file”, faites-le, vous pouvez le faire dans presque n’importe quel langage. Seulement, un développeur de Adobe (société éditrice de Flash) propose un script en Python et en PERL. Nous allons voir comment installer le script PERL, langage qui est installé sur quasiment tous les serveurs, sans même que l’on ne l’ai forcément installer.
Continue reading Sockets avec Flash: Un serveur pour les “master socket policy file”

facebooktwittergoogle_plusredditpinterestlinkedinmail