Se connecter avec
S'enregistrer | Connectez-vous

Serveur Socket. Si 1 user envoie des data ça déconnecte l'autre !!!

Dernière réponse : dans Programmation

Bonjour à tous,

Je suis train de désespérer. Voilà, je mets au point un petit script php avec des sockets multi-users. Pour l'instant rien de terrible. En gros pour l'instant dès que le joueur 1 dit "coucou", je veux que tous les autres reçoivent "coucou"...une sorte de chat en somme...

Bon j'ai récupéré le code php qui suit, mais j'ai un bug étrange à savoir que j'arrive très bien à connecter plusieurs utilisateur mais dès que l'un envoie des données, ça déconnecte les autres...

Avez vous une idée d'où ça vient ? Je vous couvrirais d'or ou de bisous (au choix ;-) )

Merci de votre attention !

Benoît

  1. <?php
  2.  
  3. // Set time limit to indefinite execution
  4. set_time_limit (0);
  5.  
  6. // Set the ip and port we will listen on
  7. $address = '127.0.0.1';
  8. $port = 2010;
  9. $max_clients = 10;
  10.  
  11. // Array that will hold client information
  12. $client = Array();
  13.  
  14. // Create a TCP Stream socket
  15. $sock = socket_create(AF_INET, SOCK_STREAM, 0);
  16. // Bind the socket to an address/port
  17. socket_bind($sock, $address, $port) or die('Could not bind to address');
  18. // Start listening for connections
  19. socket_listen($sock);
  20.  
  21. // Loop continuously
  22. while (true) {
  23. // Setup clients listen socket for reading
  24. $read[0] = $sock;
  25. for ($i = 0; $i < $max_clients; $i++)
  26. {
  27. if ($client[$i]['sock'] != null)
  28. $read[$i + 1] = $client[$i]['sock'] ;
  29. }
  30. // Set up a blocking call to socket_select()
  31. $ready = socket_select($read, $write = NULL, $except = NULL, $tv_sec = NULL);
  32. /* if a new connection is being made add it to the client array */
  33. if (in_array($sock, $read)) {
  34. for ($i = 0; $i < $max_clients; $i++)
  35. {
  36. if ($client[$i]['sock'] == null) {
  37. $client[$i]['sock'] = socket_accept($sock);
  38. break;
  39. }
  40. elseif ($i == $max_clients - 1)
  41. print ("too many clients");
  42. }
  43. if (--$ready <= 0)
  44. continue;
  45. } // end if in_array
  46.  
  47. // If a client is trying to write - handle it now
  48. for ($i = 0; $i < $max_clients; $i++) // for each client
  49. {
  50. if (in_array($client[$i]['sock'] , $read))
  51. {
  52. $input = socket_read($client[$i]['sock'] , 1024);
  53. if ($input == null) {
  54. // Zero length string meaning disconnected
  55. unset($client[$i]);
  56.  
  57. }
  58. $n = trim($input);
  59. if ($input == 'exit') {
  60. // requested disconnect
  61. socket_close($client[$i]['sock']);
  62. } elseif ($input) {
  63. // strip white spaces and write back to user
  64. $output = ereg_replace("[ \t\n\r]","",'<thenodemyData="utilisateur : "'.$i.' />').chr(0);
  65. for ($j = 0; $j < $max_clients; $j++) // for each client
  66. {
  67. if ($client[$j]['sock'])
  68. {
  69. socket_write($client[$j]['sock'], $output);
  70. }
  71. }
  72. }
  73. } else {
  74. // Close the socket
  75. socket_close($client[$i]['sock']);
  76. unset($client[$i]);
  77. }
  78. }
  79. } // end while
  80. // Close the master sockets
  81.  
  82. socket_close($sock);
  83.  
  84. ?>
Lassé par la pub ? Créez un compte

Meilleure solution

Expert Programmation

benoit5699 a dit :
Bon j'ai récupéré le code php qui suit, mais j'ai un bug étrange à savoir que j'arrive très bien à connecter plusieurs utilisateur mais dès que l'un envoie des données, ça déconnecte les autres...

Avez vous une idée d'où ça vient ? Je vous couvrirais d'or ou de bisous (au choix ;-) )
Je vois pas ou c'est "étrange", ton code fait exactement ce que tu lui demande. Je te le résume :

  1. - Initialise le bordel
  2. - Crée un tableau qui contiendra tout les sockets connéctés.
  3. - Crée un socket s1 qui écoute
  4. - Tant que Vrai :
  5. - Construit un tableau contenant s1 et tout les autres sockets ouverts
  6. - Appelle select(), qui va attendre que l'un (ou plusieurs) des sockets du tableau ai des données reçues en attente. select() renvoie le nombre de sockets qui ont des données en attente.
  7. - si s1 à des données en attentes (aka, des connexions en attente), alors accepte les connexion, et met les dans le tableau. S'il n'y a que s1 qui a des données en attente, alors saute la suite.
  8. - pour tout les autres sockets :
  9. - S'il contient des données en attente :
  10. - Lit les données. Si ce qui est lu est une fin de connexion, alors ferme la connexion et supprime la du tableau. Sinon, pour tout les autres sockets :
  11. - Écrit cette donnée dans leur socket
  12. - Sinon (sous entendu : s'il ne contient pas des données en attentes) :
  13. - !!! Ferme la connexion !!!

ça veut dire que dès que tu reçoit quelque chose, tu va fermer tout ceux qui n'ont rien envoyé, c'est pas très sympa ;)  Si tu vire le code (vers les lignes 74) qui ferme la socket s'il y a rien en attente, alors ça devrai mieux marcher ;) 

benoit5699 a dit :
Bonjour à tous,

Je suis train de désespérer. Voilà, je mets au point un petit script php avec des sockets multi-users. Pour l'instant rien de terrible. En gros pour l'instant dès que le joueur 1 dit "coucou", je veux que tous les autres reçoivent "coucou"...une sorte de chat en somme...

Les clients sont codés en flash mais cela importe peu.

Bon j'ai récupéré le code php qui suit, mais j'ai un bug étrange à savoir que j'arrive très bien à connecter plusieurs utilisateur mais dès que l'un envoie des données, ça déconnecte les autres...

Avez vous une idée d'où ça vient ? Je vous couvrirais d'or ou de bisous (au choix ;-) )

Merci de votre attention !

Benoît

  1. <?php
  2.  
  3. // Set time limit to indefinite execution
  4. set_time_limit (0);
  5.  
  6. // Set the ip and port we will listen on
  7. $address = '127.0.0.1';
  8. $port = 2010;
  9. $max_clients = 10;
  10.  
  11. // Array that will hold client information
  12. $client = Array();
  13.  
  14. // Create a TCP Stream socket
  15. $sock = socket_create(AF_INET, SOCK_STREAM, 0);
  16. // Bind the socket to an address/port
  17. socket_bind($sock, $address, $port) or die('Could not bind to address');
  18. // Start listening for connections
  19. socket_listen($sock);
  20.  
  21. // Loop continuously
  22. while (true) {
  23. // Setup clients listen socket for reading
  24. $read[0] = $sock;
  25. for ($i = 0; $i < $max_clients; $i++)
  26. {
  27. if ($client[$i]['sock'] != null)
  28. $read[$i + 1] = $client[$i]['sock'] ;
  29. }
  30. // Set up a blocking call to socket_select()
  31. $ready = socket_select($read, $write = NULL, $except = NULL, $tv_sec = NULL);
  32. /* if a new connection is being made add it to the client array */
  33. if (in_array($sock, $read)) {
  34. for ($i = 0; $i < $max_clients; $i++)
  35. {
  36. if ($client[$i]['sock'] == null) {
  37. $client[$i]['sock'] = socket_accept($sock);
  38. break;
  39. }
  40. elseif ($i == $max_clients - 1)
  41. print ("too many clients");
  42. }
  43. if (--$ready <= 0)
  44. continue;
  45. } // end if in_array
  46.  
  47. // If a client is trying to write - handle it now
  48. for ($i = 0; $i < $max_clients; $i++) // for each client
  49. {
  50. if (in_array($client[$i]['sock'] , $read))
  51. {
  52. $input = socket_read($client[$i]['sock'] , 1024);
  53. if ($input == null) {
  54. // Zero length string meaning disconnected
  55. unset($client[$i]);
  56.  
  57. }
  58. $n = trim($input);
  59. if ($input == 'exit') {
  60. // requested disconnect
  61. socket_close($client[$i]['sock']);
  62. } elseif ($input) {
  63. // strip white spaces and write back to user
  64. $output = ereg_replace("[ \t\n\r]","",'<thenodemyData="utilisateur : "'.$i.' />').chr(0);
  65. for ($j = 0; $j < $max_clients; $j++) // for each client
  66. {
  67. if ($client[$j]['sock'])
  68. {
  69. socket_write($client[$j]['sock'], $output);
  70. }
  71. }
  72. }
  73. } else {
  74. // Close the socket
  75. socket_close($client[$i]['sock']);
  76. unset($client[$i]);
  77. }
  78. }
  79. } // end while
  80. // Close the master sockets
  81.  
  82. socket_close($sock);
  83.  
  84. ?>

Putain E-NORM-E-MENT merci pour cette réponse précise.
Bah en effet une fois que l'on a vu l'erreur c'est évident...mais comme j'avais récupéré ce bout de code et que je débute avec les sockets, c'est pas évident.
Merci encore et bonne continuation !!
++
BEnoît
Lassé par la pub ? Créez un compte