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 :

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;
?>
Je lance ce code via une page PHP (qui en fait sera lancé quand une notification arrivera sur le site

Puis elle passe dans ce code qui appelle sendTo:

(traitement_requete.php)

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);
}
 
?>
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
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";
}
Ci-joint la capture de wireshark (en bleu surligné c'est ma data attendue) à voir il envoi deux fois de suite ....

Nom : img.jpg
Affichages : 507
Taille : 395,6 Ko

Merci à tout ceux qui pourront m'aider à résoudre ce problème de doublons ....