stream_socket_client | Lesen bis Output leer dann nächstes schreiben.

  • PHP

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    stream_socket_client | Lesen bis Output leer dann nächstes schreiben.

    Tagchen,
    hänge mal wieder an einem Problem.

    Ich versuche gerade einen kleinen TS3-PHP-Bot zu machen.
    An sich soweit kein Problem.
    Die Verbindung , das Einloggen, das Auswählen des Servers und auch
    das auslesen des Outputs ( in gewissen maßen ) funktioniert.
    Nun möchte ich aber nach jeden abgesendeten Befehl
    erstmal warten bis alles an Informationen zurück gekommen ist.

    Zurzeit sieht das ganze so aus : (ACHTUNG: sehr quick & dirty ist noch rohfassung und nur local ausgeführt)
    Spoiler anzeigen

    PHP-Quellcode

    1. $tsFP = stream_socket_client("tcp://". $ip. ":". $tcpport , $errno, $errstr);
    2. echo "<br>";
    3. echo "DEBUG: Verbinde....";
    4. echo "<br>";
    5. if (!$tsFP) {
    6. echo "$errstr ($errno)<br />\n";
    7. } else {
    8. stream_set_blocking ( $tsFP , false );
    9. echo "Logging in.....<br>";
    10. flush();
    11. fwrite($tsFP, $logincmd. "\n");
    12. sleep(3);
    13. echo fgets($tsFP, 1024);
    14. echo "<br>";
    15. flush();
    16. echo "Select Server.....<br>";
    17. fwrite($tsFP, $usecmd. "\n");
    18. sleep(3);
    19. echo fgets($tsFP, 1024);
    20. echo "<br>";
    21. flush();
    22. echo "Register event.....<br>";
    23. fwrite($tsFP, $svnotif. "\n");
    24. sleep(3);
    25. echo fgets($tsFP, 1024);
    26. echo "<br>";
    27. flush();
    28. echo "Set name.....<br>";
    29. fwrite($tsFP, $svname. "\n");
    30. sleep(3);
    31. echo fgets($tsFP, 9999);
    32. echo "<br>";
    33. flush();
    34. echo "Get clientlist.....<br>";
    35. fwrite($tsFP, $svclientlist. "\n");
    36. sleep(3);
    37. echo fgets($tsFP);
    38. echo "<br>";
    39. echo "Got everything now loop.....<br>";
    40. flush();
    41. sleep(5);
    42. while (!feof($tsFP)) {
    43. $result = fgets($tsFP, 2048);
    44. if ($result != "") {
    45. if (containsWord($result ,"notifyclientleftview") )
    46. {
    47. $converted = getArray($result);
    48. echo "<pre>";
    49. print_r($converted);
    50. echo "</pre>";
    51. }
    52. if (containsWord($result ,"notifycliententerview") )
    53. {
    54. $converted = getArray($result);
    55. echo "<pre>";
    56. print_r($converted);
    57. echo "</pre>";
    58. }
    59. echo "<br>NEW ENTRY:::";
    60. echo $result;
    61. flush();
    62. }
    63. }
    64. fclose($tsFP);
    65. }


    Nun möchte ich nach jedem fwrite() alles was zurück kommt erhalten.
    Ich wüsste nun nur keinen wirklich guten Ansatz.
    Habe ja am Ende schon die while worin dann mehr oder weniger die Events abgefangen werden
    die ich dann Parse und und und.
    Nur möchte ich die vorher gehenden Befehle sauber abschicken und
    auch die Antwort sauber zurück bekommen was hier manchmal einfach nicht geht
    weil er dann die letzte Antwort garnicht ausgibt und diese dann schon in der while landet.
    Irgendwelche Ideen ?

    Kurzum was ich möchte:
    - fwrite() sendet login daten
    - nun möchte ich warten bis der server alles an mich gesendet hat ( meistens ist es nur die meldung "error id=0 msg=ok" oder halt mit einer error is + warum error)
    - danach möchte ich den nächsten befehl senden und wieder warten bis alles zurück kam.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Heyho,

    mein Problem an sich hat sich erledigt.
    Das

    PHP-Quellcode

    1. stream_set_blocking ( $tsFP , false );

    Hab ich auf

    PHP-Quellcode

    1. stream_set_blocking ( $tsFP , true);

    gestellt für die einzel aufrufe.
    So bekomme ich es genau so wie ich will.
    Thema hat sich also erledigt.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen