Control timeouts de socket
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!!!
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!!!
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;
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;