Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de sockets

timeout énoooooooooooorme

Sujet résolu
    23 avril 2007 à 17:28:49

    Salut!

    Voila, je suis en train de créer une fonction de dialogue avec un serveur de jeu ( les serveurs Source ), pour connaitre le temps de jeu, le pseudo, les frag et toust le tralala pour chaque joueur.

    Le script marche, de ce côté, pas de problème. Seulement voila, bien que le script recoive les données en moins de 2 secondes, il attend 60 secondes avant de sortir de ma boucle de réception de données. Cette dernière ressemble à ça :
    fwrite($fp,$request_player);
            do {
                    $recive = fread($fp, 128);
                    $player .= $recive;
                    $socketstatus = socket_get_status($fp);
                   
            } while ($socketstatus["unread_bytes"]);


    Si le problème ce n'était que ca, pas de problème! Un petit timeout de 5sec et voila. Seulement mon script se comporte aléatoirement. Une fois ca affiche les données tout de suite une autre il se comporte comme je l'ai décrit au dessus.

    En plus le dialogue implique de recevoir un code du serveur, et ce bout de code chronométré donne ca

    Citation : Réception des données serveur

    Temps d'execution du socket 1 (challenge) : 0.0954
    Temps d'execution du socket 2 (serv_info) : 60.0256
    Temps d'execution du socket 3 (player_info) : 60.0134



    J'aimerais bien comprendre ce qui se passe. Je veut pas forcément une solution (pour ca j'ai 2-3 neurones qui vont se mettre au boulot :p ), mais j'aimerait savoir quel est cet étrange phénomène.
    • Partager sur Facebook
    • Partager sur Twitter
      26 avril 2007 à 18:38:31

      Bon hé ben grande découverte, le serveur source connait pas l'octet EOT (End OF Transmission). Résultat il ouvre une connection qui parrait persistante à PHP et la boucle ne se termine jamais, étant donné qu'il y sensé toujours avoir quelque chose à lire, sauf que y'a rien.
      Donc la solution c'est de tout prendre en un coup :
              fwrite($fp,$request_player);
      $recive = fread($fp, 8192);
      $player = $recive;

      C'est plus simple, mais si le socket renvoie plus de 8192 octets (valeur max dans PHP), ben le reste passe à la trappe.
      Je considère donc le problème comme résolu, mais si quelqu'un à une autre méthode, je suis preneur.
      • Partager sur Facebook
      • Partager sur Twitter

      Problème de sockets

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown