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

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

Marsh Posté le 02-08-2011 à 00:09:49    

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
Reply

Marsh Posté le 02-08-2011 à 00:09:49   

Reply

Marsh Posté le 06-08-2011 à 23:09:32    

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.

Reply

Marsh Posté le 09-08-2011 à 14:46:25    

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
Reply

Marsh Posté le 19-08-2011 à 19:17:49    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed