entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Problemas con Sockets en PHP

Hola Buenos días.

Llevo bastantes días mirando a ver que le ocurre a éste trozo de código que envía Sockets. Pero no entiendo por qué no funciona como debería. Explico su funcionamiento y mi problema.

El siguiente código que mostraré a continuación es el código de un método llamado send(), el cual envía un Mensaje $message (Es parámetro del método send()).

$data['ip']     = 'XXX.XXX.XXX.XXX';
$data['puerto'] = XXXX;

// Creamos el Socket.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// Especificamos un tiempo máximo de 5 segundos.
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array("sec"=>4, "usec"=>0));

// Nos conectamos al Socket.
if(socket_connect($socket, $data['ip'], $data['puerto']) === FALSE){

    // Cerramos el Socket.
    socket_close($socket);

    return false;

} else {

    // Enviamos el mensaje al Socket.
    socket_write($socket, $message, strlen($message));

    // Cerramos el Socket.
    socket_close($socket);

    return true;

}

El problema es que necesito marcar un TIMEOUT de 4 segundos, y cuando éste salte, devolver un return false; al igual que si no se logra conectar con ese IP:PUERTO.

El código no funciona como debería, puesto que hay veces que se queda colgado y no entiendo que es lo que puede suceder. Espero que alguien en ésta Comunidad pueda resolver mi duda.

Muchísimas gracias por adelantado.

1 Respuesta

1voto

Leonardo-Tadei Puntos227320

Hola angelblxt,

hay un fallo reportado en el manejo de los usec en PHP 5.2 bajo MS Windows.

http://php.net/manual/es/function.socket-set-option.php#101108

Fijate en todos los comentarios ya que se habla bastante sobre el tema.

Qué verisón de PHP es? Sobre qué platalaforma estás trabajando?

0voto

angelblxt comentado

Mi versión de PHP es: 5.5.9-1ubuntu4.3.

Trabajo sobre la plataforma Ubuntu 14.04 LTS.

0voto

Leonardo-Tadei comentado

Entonces debe ser otra cosa...

qué te devuelve la salida de:

var_dump(socket_set_option($socket,SOL_SOCKET,SO_RCVTIMEO));

???

Poné esto en un IF antes del IF.

También poné un print() adentro del IF para ver si, cuando se queda colgado está conectando o no... podrías poner por ejemplo una salida antes del write o otra después, para ver si pasa por esas líneas... no es elegante pero es muy bueno para debbuguear!.

Adicionalmente, podrías usar set_option para consultar los errores que podría estar dando la conexión...

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta