Bonjour tout le monde,
J'ai actuellement un soucis avec les sockets que j'utilise dans mon programme (le message est envoyé en double).
Voici la situation, le code en PHP qui envoie le message est celui-ci :
Le code part d'ici :
Je lance ce code via une page PHP (qui en fait sera lancé quand une notification arrivera sur le site
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 <?php // simple POST Request /* * Cette partie concerne le push d'une notification au Web Service qui va se charger de l'envoyer aux personnes concernées. * * Paramètres attendus : * - $message : Contenu de la notification qui sera affiché en pop-up * - $url : Contient l'url pointant sur la notification * - $id_guid : Contient l'id du group à qui est envoyé la notification * - $id_guid_wall : Contient l'id du mur qui concerne la notification (ou pas suivant le type de notification). */ $message = "**********"; $url_notif = "**************"; $id_guid = 2; $id_guid_wall = 4; // Ici, on place l'URL de la page de traitement suivant les paramètres reçus $url = 'http://************/web-service-notifications/traitement_requete.php'; // On enregistre dans un tableau l'ensemble des données que nous avons besoin $data = array('method'=>"push", 'message' => $message, 'url' => $url_notif, 'id_guid' => $id_guid, 'id_guid_wall' => $id_guid_wall); // On enregistre dans un tableau la "structure" d'envoi de données par une requête POST $options = array( 'http' => array( 'header' => "Content-type: application/x-www-form-urlencoded;charset=UTF-8", 'method' => 'POST', 'content' => http_build_query($data), ), ); // On crée un contexte de flux entre la page et cette page pour envoyer puis réceptionner une réponse (si l'action s'est bien effectuée ou pas) // Le contexte de flux se résume à la mise en place du tunnel de données entre les deux pages $context = stream_context_create($options); // On lance la requête et on attends la réponse du côté de la page $url. $result = mb_convert_encoding(file_get_contents($url, false, $context), 'UTF-8',mb_detect_encoding(file_get_contents($url, false, $context), 'UTF-8, ISO-8859-1', true)); echo $result; ?>
Puis elle passe dans ce code qui appelle sendTo:
(traitement_requete.php)
Donc cela appel sendTo :
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 <?php /* * Cette partie s'occupe de traiter les différentes requêtes HTTP faites par un utilisateur ou par Link Us */ // On précise que cette partie utilise le format JSON et on inclue les fonctions utiles include_once("functions.php"); // On vérifie si des données POST ont été reçues (que du POST que ce soit côté utilisateur comme côté Link US if(isset($_POST)){ // On gère la connection d'un utilisateur if($_POST['method'] == "connect"){ // On récupère les données de session de l'utilisateur $session=$_POST['session']; $ip=$_POST['ip']; $port=$_POST['port']; // On exécute la fonction qui va bien et on s'assure de son bon fonctionnement $result=connectionTo($session,$ip,$port); // On teste pour voir la fonction a bien fonctionnée if($result != 1){ // Si aucun résultat alors le problème se situe au niveau de la fonction même deliver_response(200, "No response for this user", NULL); } else { // L'instruction s'est bien passée, on renvoi une réponse positive avec le résultat. deliver_response(200, "Modified : OK", $session . " added"); } } // On gère la déconnection d'un utilisateur else if($_POST['method'] == "disconnect"){ // On récupère le nom de session de l'utilisateur $session=$_POST['session']; // On exécute la fonction qui va bien et on s'assure de son bon fonctionnement $result=disconnectionFrom($session); // On teste pour voir la fonction a bien fonctionnée if($result != 1){ // Si le résultat est null, alors il n'y a eut aucun changement deliver_response(200, "Modified : No", "No update"); } else { // L'instruction s'est bien passée, on renvoi une réponse positive avec le résultat. deliver_response(200, "Modified : OK", $session . " deleted"); } } // On gère le push d'une notification else if($_POST['method'] == "push"){ // On exécute la fonction qui va bien et on s'assure de son bon fonctionnement, les paramètres sont directs. $result=sendTo($_POST['message'], $_POST['url'], $_POST['id_guid'], $_POST['id_guid_wall']); // On teste pour voir la fonction a bien fonctionnée if(empty($result)){ // Si aucun résultat alors le problème se situe au niveau de la fonction même deliver_response(200, "No response for this notification", NULL); } else { // L'instruction s'est bien passée, on renvoi une réponse positive avec le résultat. deliver_response(200, "Notification sent", $result); } } else { // Aucune des méthodes n'a fonctionné, le champs "method" n'est donc pas correct. deliver_response(404, "Problem with method", null); } } else { // On ne peut pas exécuter la page sans les bons paramètres, il y a donc un problème deliver_response(404, "Problem with POST request", null); } ?>
Ci-joint la capture de wireshark (en bleu surligné c'est ma data attendue) à voir il envoi deux fois de suite ....
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 function sendTo($message,$url,$id_guid,$id_guid_wall){ /* * CETTE PARTIE SERA A ADAPTE AVEC LE TABLEAU DES UTILISATEURS EN LIGNE */ // On récupère l'adresse de destination $address = '**.***.**.***'; // On récupère le port d'écoute $service_port = ****; // On stocke les données dans un tableau $data = array('message'=>utf8_encode($message), 'url'=>$url, 'id_guid'=>$id_guid, 'id_guid_wall'=>$id_guid_wall); // On les encode au format JSON $in = json_encode($data); // On crée une socket TCP/IP $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "<br />"; } // On se connecte à la machine distante via la socket créée, l'adresse IP et le numéro de port $result = socket_connect($socket, $address, $service_port); if ($result === false) { echo "socket_connect() failed.<br />Reason: ($result) " . socket_strerror(socket_last_error($socket)) . "<br />"; } // On envoi la notification au format JSON echo socket_write($socket, $in, strlen($in)); // On ferme la connexion socket_close($socket); return "Transmission OK"; }
Merci à tout ceux qui pourront m'aider à résoudre ce problème de doublons ....
Partager