Cita:
Iniciado por GatorV
Hola RollerSky,
...
No puedes abrir un Socket desde el servidor al mismo servidor, a menos que tengas otro servidor de "mediador" (dentro del mismo servidor) para entonces comunicarte vía sockets, aunque seria redundante.
....
¿No?
Yo estoy haciendo una práctica donde tengo un servidor que gestiona reservas para un hotel (implementado en Java) y que se comunica luego con la página web mediante sockets implementados en PHP.
La cosa es que estoy probándolo localmente y los envíos por PHP se hacen correctamente, el problema es que luego el fgets se queda un minuto extacto esperando a recibir algo (cosa que no hace) y luego termina. Si trato de hacerlo con socket_read ni siquiera acaba, se queda en un bucle infinito a simple vista. Os dejo más abajo los códigos de ambos clientes para que les echéis un ojo si queréis.
Me parece extraño lo que dices porque hace poco implemente un chat con Sockets usando C y no tuve ningún problema probando cliente y servidor en la misma máquina.
¿Alguien tiene una ligera idea de lo que pasa?
Pego el código del cliente:
USANDO fsockopen
Código:
<?php
$max_timeout=3;
if(!file_exists("setup.php"))
die("Check that \"setup.php\" should be in the root directory");
include("setup.php");
$fd=fsockopen( $HOTEL_GATEWAY_ADDR, $HOTEL_GATEWAY_PORT , &$errno , &$errstr, 4 );
if($fd==FALSE && $errno==0)
echo date("H:i:s",time()).": <b> fsockopen failed: reason: ".socket_strerror(socket_last_error())."</b>";
else
echo date("H:i:s",time()).": <b>Socket opened succesfully</b><br/>";
$request="book ".$_POST['category']." \"".$_POST['guest_name']."\"";
echo date("H:i:s",time()).": <b>Sending: $request</b><br/>";
if(!fputs($fd,$request)) {
echo date("H:i:s",time()).": <b> fsockopen fputs: reason: ".socket_strerror(socket_last_error())."</b>";
exit();
} else {
echo date("H:i:s",time()).": <b>Message accepted by $HOTEL_GATEWAY_ADDR</b>.<br/>";
stream_set_timeout($fd, $max_timeout);
$str_data = fgets($fd);
$info = stream_get_meta_data($fd);
if ($info['timed_out'])
echo date("H:i:s",time()).": <b>The connection has expired after $max_timeout seconds (no response received)</b><br/>";
else
echo date("H:i:s",time()).":<b> Response: '".$str_data."'</b><br/>"; //Mostramos la salida del servidor
}
fclose($fd);
echo date("H:i:s",time()).": <b>Socket closed</b>";
?>
Respuesta:
09:11:32: Socket opened succesfully
09:11:32: Sending: book 2 "123123"
09:11:32: Message accepted by localhost.
09:11:35: The connection has expired after 3 seconds (no response received)
09:11:35: Socket closed
USANDO socket_create
Código:
<?php
$max_timeout=3;
if(!file_exists("setup.php"))
die("Check that \"setup.php\" should be in the root directory");
include("setup.php");
$my_new_socket=socket_create(AF_INET,SOCK_STREAM,getprotobyname('tcp'));
if(!socket_connect($my_new_socket,$HOTEL_GATEWAY_ADDR,$HOTEL_GATEWAY_PORT))
echo socket_strerror(socket_last_error());
$request="book ".$_POST['category']." \"".$_POST['guest_name']."\"";
echo date("H:i:s",time()).": <b>Sending: $request</b><br/>";
set_time_limit(5);
if(!socket_write($my_new_socket,$request))
echo date("H:i:s",time()).": <b>socket_write() failed: reason: " . socket_strerror(socket_last_error($my_new_socket)) . "</b><br/>";
else{
stream_set_timeout($my_new_socket, $max_timeout);
if (false === ($str_data = socket_read($my_new_socket, strlen("Book added succesfully"))))
echo date("H:i:s",time()).": <b>socket_read() failed: reason: " . socket_strerror(socket_last_error($my_new_socket)) . "</b><br/>";
$info = stream_get_meta_data($my_new_socket);
if ($info['timed_out'])
echo date("H:i:s",time()).": <b>The connection has expired after $max_timeout seconds (no response received)</b><br/>";
else
echo date("H:i:s",time()).":<b> Response: '".$str_data."'</b><br/>"; //Mostramos la salida del servidor
}
socket_close($socket);
echo date("H:i:s",time()).": <b>Socket closed</b>";
?>
Respuesta:
(se queda constantemente esperando y nunca acaba).