IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Multicast en PHP


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Multicast en PHP
    Bonjour à tous.
    C'est mon tout premier message ici

    D'habitude, j'arrive plus ou moins à trouver mes réponses à droite ou à gauche mais là..... Je sèche !

    Pour me présenter, je suis développeur PHP (procédural ) et je ne connais pas encore bien le mode des sockets.
    Ma demande est pour un projet perso.

    J'ai un capteur de consommation électrique qui envoi les données en Multicast vers le serveur du fabricant.

    La fabricant fournis un code en C pour récupérer le flux.
    Le voici :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    /*
     * listener.c -- joins a multicast group and echoes all data it receives from
     *the group to its stdout...
     *
     * Antony Courtney,25/11/94
     * Modified by: Frdric Bastien (25/03/04)
     * to compile without warning and work correctly
     */
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <time.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
     
     
    #define HELLO_PORT 22600
    #define HELLO_GROUP "224.192.32.19"
    #define MSGBUFSIZE 800
     
    main(int argc, char *argv[])
    {
      struct sockaddr_in addr;
      int fd, nbytes,addrlen;
      struct ip_mreq mreq;
      char msgbuf[MSGBUFSIZE];
     
      u_int yes=1;            /*** MODIFICATION TO ORIGINAL */
     
      /* create what looks like an ordinary UDP socket */
      if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0) {
        perror("socket");
        exit(1);
      }
     
     
      /**** MODIFICATION TO ORIGINAL */
      /* allow multiple sockets to use the same PORT number */
      if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) < 0) {
        perror("Reusing ADDR failed");
        exit(1);
      }
      /*** END OF MODIFICATION TO ORIGINAL */
     
      /* set up destination address */
      memset(&addr,0,sizeof(addr));
      addr.sin_family=AF_INET;
      addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */
      addr.sin_port=htons(HELLO_PORT);
     
      /* bind to receive address */
      if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0) {
        perror("bind");
        exit(1);
      }
     
      /* use setsockopt() to request that the kernel join a multicast group */
      mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);
      mreq.imr_interface.s_addr=htonl(INADDR_ANY);
      if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq)) < 0) {
        perror("setsockopt");
        exit(1);
      }
     
      /* now just enter a read-print loop */
      while (1) {
        addrlen=sizeof(addr);
        if ((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0,
    			 (struct sockaddr *) &addr,&addrlen)) < 0) {
          perror("recvfrom");
          exit(1);
        }
        msgbuf[nbytes] = 0x00; // null terminate before printing
        puts(msgbuf);
      }
    }

    Le problème... Je ne comprend rien en C

    Je souhaiterai juste coder un script en PHP qui récupère le flux et qui le stocke (j'ai un NAS Synology sur lequel je peux exécuter des tâches CRON).

    Il semblerait que j'ai affaire a des sockets.

    J'ai tester ce petit script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?
    $ip = "224.192.32.19";
    $port = "22600";
    $fp = fsockopen($ip,$port,&$numErr,&$msgErr);
    if(!$fp) {
    	echo "Err";
     
    }
    else{
    	echo "OK";
    }
    ?>
    Qui me renvoi :
    Warning: fsockopen() [function.fsockopen]: unable to connect to 224.192.32.19:22600 (Address family not supported by protocol family) in /Applications/MAMP/htdocs/test2.php on line 4
    Err
    Et c'est là que je sèche.....! Et ça commence à m'énerver

    Je m'en remet à vous car je n'est pas trouver grand chose là dessus.

    Merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    J'ai essayé de reproduire les bouts que j'ai compris du code C avec PHP ... bon ça ne fonctionne pas mais ça peut t'avancer.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $ip = '224.192.32.19';
    $bc_string = "HELLO_GROUP";
    $socket = socket_create(AF_INET, SOCK_DGRAM, 0);
    $opt_ret = socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
    $send_ret = socket_sendto($socket, $bc_string, strlen($bc_string), 0, $ip, 22600);
    $opt_ret = socket_set_option($socket, IPPROTO_IP, MCAST_JOIN_GROUP, 1);
     
    $from = '';
    $port = 0;
    socket_recvfrom($socket, $buf, 12, 0, $from, $port);
    echo "Received $buf from remote address $from" . PHP_EOL;
    ?>
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. [EDI] Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 400
    Dernier message: 10/04/2018, 20h08
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 07h45
  3. L'avenir est-il au PHP ?
    Par Manolo dans le forum Langage
    Réponses: 468
    Dernier message: 11/02/2008, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo