Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1765 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Communication PHP / C++ via un socket UNIX => blocage read/write

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Communication PHP / C++ via un socket UNIX => blocage read/write

n°2092802
Pascal le ​nain
Posté le 02-08-2011 à 00:09:49  profilanswer
 

Bonjour,
 
J'ai code un serveur en C++ qui tourne en daemon sur ma machine. Il ecoute sur un socket AF_UNIX (local).
 
J'ai egalement apache avec php qui tournent sur cette meme machine.
Je lance un script php qui doit se connecter au socket et echanger des donnees avec un thread nouveau du serveur.
Le principe est le meme que HTTP : le script envoie une requete, et le serveur lui repond.
 
Le client et le serveur parviennent apparement a se connecter, mais se bloquent respectivement sur l'ecriture et la lecture.
Voici un bout de code pour situer le blocage sur les deux parties :
 
SERVEUR

Code :
  1. char buffer[COM_BUFFER_LEN + 1];
  2. bzero(buffer, (COM_BUFFER_LEN + 1) * sizeof(char));
  3. int n;
  4.                                                                                                                                            
  5. int size = 0;
  6. debuglog("Reading the socket..." );
  7. while ((size < COM_BUFFER_LEN)
  8.       && ((n = recv(socket, (void*) (buffer + size), COM_BUFFER_LEN, 0)) > 0)) // BLOQUE ICI =(
  9. {
  10.  debuglog("fragment received. Trying to fetch another..." );
  11.  size += n;
  12. }
  13. if (n < 0)
  14. {
  15.  Error e;
  16.  e << "Couldn't read the socket";
  17.  throw e;
  18. }


 
 
CLIENT

Code :
  1. $socket = stream_socket_client('unix://../../chatbot/socket',
  2.                               $errno, $errstr);
  3. if (!$socket) // Fail                                                                                                                                                  
  4. {
  5.  if ($errno == 2)
  6.    $errstr = 'ChatBot is offline';
  7.  ret($errstr . ' (' . $errno . ')', 1);
  8.  fclose($socket);
  9.  exit;
  10. }
  11. // Success                                                                                                                                                              
  12.  
  13. // Send message                                                                                                                                                        
  14. $message = 'web_' . md5($_COOKIE['PHPSESSID']) . '\n' . $_POST['msg'];
  15. if (!fwrite($socket, $message)) // BLOQUE ICI =(
  16. {
  17.  ret('Failed to write in the socket', 1);
  18.  fclose($socket);
  19.  exit;
  20. }


 
Ce n'est que lorsque j'eteins le demon que la page PHP se debloque et m'affiche l'erreur 'Failed to write in the socket', preuve que fwrite a foire.
 
Avez-vous deja eu ce probleme ? Je seche un peu...  :D  
 
Merci pour votre attention  :jap:


Message édité par Pascal le nain le 02-08-2011 à 13:24:03
mood
Publicité
Posté le 02-08-2011 à 00:09:49  profilanswer
 

n°2093727
malka1986
Posté le 06-08-2011 à 23:09:32  profilanswer
 

man 3 select.
lire et ecrire sur un socket est bloquant. En passant par select tu t'assures (quasiment) que ca ne sera plus bloquant.

n°2094177
Pascal le ​nain
Posté le 09-08-2011 à 14:46:25  profilanswer
 

Salut,
 
Merci pour ta réponse.
Le select ne résoudra sans doute pas le problème, mais me permettra sans doute de faire un diagnostic. Les read/write étants bloqués, ils ne renvoyaient pas beaucoup d'erreurs...
Je vais tester ca, et je te donne des news.
 
Merci ;)


Message édité par Pascal le nain le 09-08-2011 à 14:47:55
n°2096452
the_bigboo
Posté le 19-08-2011 à 19:17:49  profilanswer
 

C'est marrant, parce que je suis aussi en train de faire un système de communication inter process, mais moi, c'est php vers php :)
J'en ai déjà fait un pour mon boulot, mais celui-ci communiquait en utilisant les queues de messages POSIX.

 

Et j'essaye de voir ce que ça donne avec les socket, j'en suis encore à découvrir les différents types de socket...


Message édité par the_bigboo le 19-08-2011 à 19:18:33

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Communication PHP / C++ via un socket UNIX => blocage read/write

 

Sujets relatifs
Valeur d'un textbox en Html PhpLister les fichiers d'un répertoire distant (sur un NAS) en PHP
call a C function from another function ![SQL] Requète SQL complexe
Planification d'une fonction PHP[PHP?]Un sous répertoire d'un site affiché comme la racine.
[PHP] Updater le contenu d'une page HTML[PHP] Indicateur de suivi en ligne ?
warning: ISO C forbids assignment between function pointer and `void *Communication avec port RS232 : Récupération de valeurs chiffrées
Plus de sujets relatifs à : Communication PHP / C++ via un socket UNIX => blocage read/write


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR