Bonjour,
Dans un programme de type serveur tcp, j'ai mis en place des sockets pour échanger des données avec des clients. Le serveur attend des connexions et pour chaque client qui fait une requête envoie des données qui sont régulièrement mises à jour par le serveur lui même. Le programme fonctionne bien sauf qu'à partir d'un certain temps, le serveur n'arrive pas à transmettre toutes les données au clients qui les attend j'ai donc un message d'erreur de ce type :
Pour infos, les données transmises par les sockets font plusieurs Mo.Erreur lors de l'envoi de données (8192sur 14802932) le socket : [10035] Une opération non bloquante sur un socket n’a pas pu être achevée immédiatement
voici le code de la fonction qui génère l'erreur.
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 function envoi_socket2(&$ref_socket,$donnees,$options_tab){ $valeur_retour=NULL; $options_tab["protocoles"]=0; valeur_par_defaut($options_tab["taille_buffer"],8192); $retour=$options_tab["taille_buffer"]; echo "send".PHP_EOL; $tab_donnees=str_split($donnees,$options_tab["taille_buffer"]); //var_dump($tab_donnees); //if($options_tab["protocoles"]==0){ //$intro=""; $p=0; if(isset($ref_socket) && (is_resource($ref_socket) || $ref_socket instanceof \Socket)){ echo "hh"; while($retour!==FALSE && $retour==$options_tab["taille_buffer"] && isset($tab_donnees[$p])){ $retour=socket_send($ref_socket, $tab_donnees[$p], strlen($tab_donnees[$p]), 0); echo "1"; if($retour===FALSE || $retour!=strlen($donnees)){ $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); echo "Erreur lors de l'envoi de données (".$retour."sur ".strlen($donnees).") le socket : [".$errorcode."] ".$errormsg.PHP_EOL; $valeur_retour=FALSE; }else{ $valeur_retour=$retour+intval($retour); } $p++; } }else{ $valeur_retour=FALSE; } //var_dump($tab_donnees[$p],$retour ); return $valeur_retour; }
Partager