2010-07-23 3 views
0

J'essaye de configurer un serveur socket en php qui reste ouvert. Cet exemple pris de php.net fermera après avoir reçu connexion ... même après en commentaire socket_close (spawn $)déconnexion du serveur socket php

<? 
// set some variables 
$host = "192.168.1.109"; 
$port = 1234; 
// don't timeout! 
set_time_limit(0); 
// create socket 
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create 
socket\n"); 


// bind socket to port 
$result = socket_bind($socket, $host, $port) or die("Could not bind to 
socket\n"); 
// start listening for connections 
$result = socket_listen($socket, 3) or die("Could not set up socket 
listener\n"); 
// accept incoming connections 
// spawn another socket to handle communication 
$spawn = socket_accept($socket) or die("Could not accept incoming 
connection\n"); 
// read client input 
$input = socket_read($spawn, 1024) or die("Could not read input\n"); 
// clean up input string 
$input = trim($input); 
// reverse client input and send back 
//$output = $input . "\n"; 
$output = strrev($input) . "\n"; 
echo $input; 
socket_write($spawn, $output, strlen ($output)) or die("Could not write 
output\n"); 

// close sockets 
//socket_close($spawn); 
//socket_close($socket); 
?> 

and here is the code for the client connecting... 

<?php 
$fp = fsockopen("192.168.1.109", 1234, $errno, $errstr, 30); 
if (!$fp) { 
    echo "$errstr ($errno)<br />\n"; 
} else { 
    //$out = "testing"; 
    $out = "GET/HTTP/1.1\r\n"; 
    $out .= "Host: 127.0.0.1\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    $out .= "testing\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) { 
     echo fgets($fp, 128); 
    } 
    fclose($fp); 
    //exit(); 
} 
//exit; 
?> 

Répondre

0

Vous devez accepter l'envelopper dans une boucle ou quelque chose. Il se ferme parce que l'exécution du script est terminée.

Vous pourriez faire quelque chose comme ceci:

while ($spawn = socket_accept($socket)) { 

//do stuff 

} 
4

socket_read sans le drapeau O_NONBLOCK (voir socket_set_nonblock) est une opération de blocage, de sorte qu'il y attendre jusqu'à ce qu'il reçoive quelque chose. Dès que quelque chose est reçu, le reste du script continue et se termine, car il n'y a pas de boucle en place pour faire la lecture suivante. (c'est-à-dire: dans un serveur il est habituel de faire un while(true){} loop)

+0

merci cela a fonctionné – sonics876

+2

Puis marquez-le comme la réponse. :( – funwhilelost

Questions connexes