Control timeouts de socket

iana
28 de Diciembre del 2004
Hola a tod@s

No tengo mucha experiencia en Php estoy trabajando con sockets y tengo un problema.

Estoy conectando un demonio hecho en C, esperando conexiones recibiendo informacion y desconectando al cliente.

Todo funciona perfectamente, pero tengo una duda, ¿¿que timeout tiene mi código?? Como puedo establecer una conexion controlando por ejemplo un timeout de 2 sg.

Ahora mismo, funciona, pero debo controlar perfectamente el timeout y no se como.
Os pego un cacho de código

$ip_bonus = \'192.168.0.22\';
$puerto_servicio = \'8300\';


// Crear un socket TCP/IP.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
socket_close($socket);
return false;
}


echo "Connecting to \'$ip_bonus\' port \'$puerto_servicio\'...";
$resultado = socket_connect($socket, $ip_bonus, $puerto_servicio);
if ($resultado < 0) {
echo "socket_connect() error: ($resultado) " .
socket_strerror($resultado) . "<BR>";
write_to_pending($in);
socket_close($socket);
return false;
} else {
echo "Connected.\n";
}

echo "Sending request..." . $in;
if (socket_write($socket, $in, strlen($in)) === FALSE) {
socket_close($socket);
return false;

}

echo "Reading response:<BR>";
while ($out = socket_read($socket, 512)) {
$returned = $out;
}

if ($out === false ) {
write_to_pending($in);
socket_close($socket);
return false;
}

echo "Closing socket...";
socket_close($socket);


Muchas gracias de antemano!!!

iana
28 de Diciembre del 2004
Ya he encontrado la solucion, os la pongo por si alguien esta interesado.

Basicamente, he dejado de usar las funciones socket-write socket_connect.... y he pasado a usar estas otras que me permiten afinar más lo que quiero hacer.

Gracias de todas formas.



$fp = fSockOpen($ip_bonus, $puerto_servicio , $errno, $errstr, 0.2);
if($fp) {
fputs($fp, $in);
stream_set_timeout($fp, 2);

$result = "";
$status = socket_get_status($fp);
echo "Reading...<br>";
while(!feof($fp) && !$status['timed_out']) {
$result .= fgets($fp, 1000);
$status = socket_get_status($fp);
}

echo "Status...<br>";
if ( $status['timed_out'] ) {
echo "<h1>TIMEOUT</h1>";
return false;
}

fclose($fp);
} else return false;