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;
        }