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 :

Utilisation de socket_recvfrom


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 80
    Points : 74
    Points
    74
    Par défaut Utilisation de socket_recvfrom
    Bonjour,

    J'utilise les connexionx UDP entre un contrôleur et une interface web.

    Je reçoit sans problème apparent les connexions UDP, mais j'ai des soucis d'erreur d'avertissement sans information précise avec la fonction socket_recvfrom


    Voici mon code utilisé (toute proposition d'amélioration du code en général est la bienvenue...).

    Code : 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
    80
    81
    82
    83
    84
    85
    86
    87
    88
     private function socketUdpConnection ( )
        {    
            // func=2 est reservé aux accusés réception en connexion socket
            // Si l'on reçoit une func=2 en GET/POST on sort, c'est une erreur de programmation
            if ( $this->inputs['func'] == 2 )
            {   
                $message = '[ERROR 2] .::Requette UDP by '.$_SERVER['REMOTE_ADDR'].'::. -> '.LANG_errorProg.' => '.$confirmation;
                $this->logFile( 'error', '['.$this->getDate( time() ).'] '.$message  );
                exit;
            }
     
            // extration des champs pour les affecter a une variable
            $func = $this->inputs['func'];
            $to   = $this->inputs['to'];
            $val  = $this->inputs['val'];
            $valfloat  = $this->inputs['valfloat'];
            $date = $this->inputs['date'];
     
            // Ip de l'aruino 
            $host = CONFIG_IP_ARDUINO;
            // Port de l'arduino
            $port = CONFIG_PORT_ARDUINO;
     
            // Creer le Socket
            $socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
     
            socket_set_nonblock($socket);
     
            // Envois les données a l'arduino en connexion socket UDP
            socket_sendto($socket, $func.','.$to.','.$val.','.$valfloat.','.$date, strlen($func.','.$to.','.$val.','.$valfloat.','.$date), 0, $host, $port);
     
            // Gestion des accuses reception de l'arduino pour affichage sur le site web
            $repTo = '';
            $retConfirmation = '';
            $time_start = time() ;
            $timeout = 20; // 20 secs
     
            // Confirmation UDP
            $confirmation = 'func='.$func.'&to='.$to;
     
            $this->counter = 0;
            $ready = false;
     
            // On fait une lecture UDP jusqu'au (timeout: 10s)
            // Si l'on a pas reçu la confirmation udp, on renvois la requette et on relance une lecture UDP
            // Si pas de reponde on recommance le cycle 4 fois (count:4)
     
            while( $this->counter <= 3 && $ready === false )
            {   
                // On incremente notre compteur pour commancer a 1
                $this->counter++;
                $time = time();
     
                // On attend que la tempo soit terminé ou de recevoir la confirmation UDP
                do
                {   
                    // Si la reception UDP retourne une erreur
                    socket_recvfrom($socket, $buffer, strlen($confirmation), 0, $host, $port);				
                }
                while( ((time() - $time ) <= $timeout) && ( $buffer !== $confirmation) );
     
                // Si la confirmation UDP n'a pas ete recu, c'est que l'on a atteint la tempo
                if ($buffer !== $confirmation)
                {
                    // On renvoit les données a l'arduino en connexion socket UDP
                    socket_sendto($socket, $func.','.$to.','.$val.','.$valfloat.','.$date, strlen($func.','.$to.','.$val.','.$valfloat.','.$date), 0, $host, $port);
                }
                else
                {
                    $ready = true;
                }
    		}
     
            // Si la confirmation UDP n'a pas ete recu, c'est que l'on a atteint le nombre maxi de tentative (3)
    		if ($this->counter > 3)
            {   
     
                $message = '[ERROR 3] .::Requette UDP by '.$_SERVER['REMOTE_ADDR'].'::. -> '.LANG_udpRequestFailed.$this->counter.' '.LANG_attempt;
                $this->logFile( 'error', '['.$this->getDate( time() ).'] '.$message  );
     
                if ( $func == 1 )
                    echo 'false|'.LANG_replyUdpTimeOut.' au bout des '.$this->counter.' tentatives';
                else
                    echo 'replyUDPerror|'.$confirmation;
     
                socket_close($socket);
                exit;
            }

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 80
    Points : 74
    Points
    74
    Par défaut

  3. #3
    Membre éprouvé Avatar de Shuty
    Homme Profil pro
    Ingénieur en développement
    Inscrit en
    Octobre 2012
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur en développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 630
    Points : 1 174
    Points
    1 174
    Par défaut
    Peux tu nous donner l'erreur ? Si besoin va dans les log php.
    Agence web Dim'Solution, créateur de solutions numériques
    Sites internet, ecommerce, logiciels, applications mobiles, référencement (SEO), plugin Prestashop, Magento, WordPress, Joomla!...

    Cours de trading gratuit | Envoyer des sms gratuitement | Envoyer des fax gratuitement | Plateforme de Fax à l'international

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

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