[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-general-es
Subject:    Re: [PHP-ES] Consulta sobre SOCKETS
From:       Yoandy_Madrazo_Gómez <root () astisur ! telemar ! cu>
Date:       2009-02-09 15:19:12
Message-ID: 49904970.9050409 () astisur ! telemar ! cu
[Download RAW message or body]


Prefiero usar  fsockopen() y además no pones la cadena que mandas a 
pasarle al socket para saber que hay mal.

Esto es sacado de la ayuda del PHP

Saludos, Yoandy


  fsockopen

(PHP 3, PHP 4, PHP 5)

fsockopen --  Abrir una conexión de sockets de dominio de Internet o Unix


    Descripción

resource *fsockopen* ( string destino [, int puerto [, int &errno [, 
string &errstr [, float tiempo_espera]]]] )

Inicia una conexión a través de sockets con el recurso especificado por 
destino. PHP soporta el uso de destinos en los dominios de Internet y 
Unix, tal y como se describe en Apéndice O <transports.html>. Una lista 
de transportes soportados puede recuperarse usando 
*stream_get_transports()* <function.stream-get-transports.html>.

    *Nota: *Si necesita establecer un tiempo de espera para la
    lectura/escritura de datos a través del socket, use
    *stream_set_timeout()* <function.stream-set-timeout.html>, dado que
    el parámetro tiempo_espera de *fsockopen()* sólo se aplica cuando se
    conecta con el socket.

A partir de PHP 4.3.0, si ha compilado el soporte para OpenSSL, usted 
puede usar un prefijo sobre el nombre_host, ya sea 'ssl://' o 'tls://' 
para usar una conexión de cliente SSL o TLS sobre TCP/IP para conectarse 
con el host remoto.

*fsockopen()* devuelve un apuntador de archivo el cual puede ser usado 
junto con otras funciones de archivos (como *fgets()* 
<function.fgets.html>, *fgetss()* <function.fgetss.html>, *fwrite()* 
<function.fwrite.html>, *fclose()* <function.fclose.html>, y *feof()* 
<function.feof.html>).

Si la llamada falla, devolverá *FALSE*, y si los argumentos opcionales 
errno y errstr están presentes, serán modificados para indicar el error 
de nivel de sistema real que ocurrió en la llamada de sistema connect(). 
Si el valor devuelto en errno es 0 y la función devolvió *FALSE*, es un 
indicio de que el error ocurrió antes de la llamada a connect(). Lo más 
probable es que esto se deba a un problema con la inicialización del 
socket. Note que los argumentos errno y errstr siempre serán pasados por 
referencia.

Dependiendo del entorno, el dominio Unix o el tiempo de espera de 
conexión opcional pueden no estar disponibles.

El socket será abierto por defecto en modo de bloqueo. Puede cambiar a 
modo de no-bloqueo usando *stream_set_blocking()* 
<function.stream-set-blocking.html>.

*Ejemplo 1. Ejemplo de *fsockopen()**

> <?php
$da = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$da) {
    echo "$errstr ($errno)<br />\n";
} else {
    $salida = "GET / HTTP/1.1\r\n";
    $salida .= "Host: www.example.com\r\n";
    $salida .= "Connection: Close\r\n\r\n";

    fwrite($da, $salida);
    while (!feof($da)) {
        echo fgets($da, 128);
    }
    fclose($da);
}
?> |

El ejemplo a continuación presenta la forma de recuperar la fecha y hora 
desde el servicio UDP "daytime" (puerto 13) en su propia máquina.

*Ejemplo 2. Uso de una conexión UDP*

> <?php
$da = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$da) {
    echo "ERROR: $errno - $errstr<br />\n";
} else {
    fwrite($da, "\n");
    echo fread($da, 26);
    fclose($da);
}
?> |

*Aviso*

En ocasiones, los sockets UDP parecerán haber sido abiertos sin errores, 
incluso si el host remoto no puede ser contactado. El error sólo se 
percibirá cuando lea o escriba datos hacia/desde el socket. La razón es 
que UDP es un protocolo "sin conexión", lo que quiere decir que el 
sistema operativo no intenta establecer un enlace con el socket hasta 
que necesite realmente enviar o recibir datos.

    *Nota: *Cuando se especifique una dirección numérica IPv6 (p.ej.
    fe80::1) se debe incluir la IP entre corchetes. Por ejemplo
    tcp://[fe80::1]:80.

    *Nota: *El parámetro de tiempo de espera fue introducido en PHP
    3.0.9 y el soporte para UDP fue añadido en PHP 4.



********************** 	*
* *Yoandy Madrazo Gómez* 	*
* Administrador de Red 	*
* Email: root@astisur.telemar.cu 	*
* Jabber: yoandy@softwarelibre.cu 	*
* Astilleros Astisur, Cienfuegos 	*
********************** 	*









Berlington Barnett escribió:
> Saludos desde Costa Rica    
> 
> Recien estoy iniciando en el mundo de los SOCKETS, por lo que considero tengo \
> problemas de comunicación. 
> Como podrán apreciar en el código que incluyo abajo, mismo que tomé de la Web me \
> está ocasionando el siguiente problema. 
> La apertura, escritura y cierre del SOCKET son totalmente exitosas, no así la \
> lectura del mismo, que me ocasiona un congelamiento indefinido del Browser que \
> ejecuta el script y no tengo la menor idea porque se da esta situación, ya que he \
> leído toda la información sobre SOCKETS a al parecer solo a mi me ha pasado tal \
> situación. 
> Agradecería cualquier TIP que me puedan brindar sobre este tema, ya que estoy \
> desarrollando una aplicación muy importante para mi compañia y el servidor desde el \
> cual debo obtener la información utiliza SOCKET para transmitirla. 
> De antemano muchisimas gracias por su ayuda.
> 
> error_reporting(E_ALL);
> 
> // Elimina los mensajes de error / Warning
> ini_set('display_errors', 1);
> 
> include('../common/commonws.php');
> 
> 
> // Prepara tramas
> $numerocontrato='5104831';
> //Arma la trama de conexion
> $trama800 ='0800'; //Tipo Trama
> $trama800.='0000000000000000'; //Bitmap1
> $trama800.='0000000000000000'; //Bitmap2
> $trama800.=llenacampo(fecha1(),10,' ','izquierda'); //Fecha
> $trama800.=llenacampo('1',6,' ','derecha'); //Consecutivo
> $trama800.=llenacampo('1600',7,' ','derecha'); //Recaudador
> $trama800.='00'; //Codigo Envia
> $trama800.='001'; //Transaccion
> $trama800.=llenacampo('0',360,'0','derecha'); //Libre
> $trama800.=chr(13).chr(10); //Fin de trama
> 
> //Arma la trama y la envia como respuesta
> $trama200='';
> $trama200.='0200'; // Tipo de trama
> $trama200.='722000010A800000'; //Bitmap
> $trama200.='0000000000000000'; //Bitmap 1
> $trama200.=llenacampo($numerocontrato,18,' ','izquierda');//Numero Contrato
> $trama200.='310000';// Consulta Pendientes
> $trama200.=llenacampo('0',12,' ','izquierda');//Monto
> $trama200.=llenacampo(fecha1(),10,' ','izquierda');//Periodo
> $trama200.=llenacampo('24338',6,' ','izquierda');//No. Transaccion
> $trama200.=llenacampo('0',8,'0','izquierda');//Fecha de Pago
> $trama200.=llenacampo('1600',7,' ','izquierda');//recaudador
> $trama200.=llenacampo('43400',12,'0','derecha');//Nota Credito
> $trama200.='12';//Codigo Envio
> $trama200.='345678 4';//Punto de Pago
> $trama200.=llenacampo('10000000000',299,' ','izquierda');//Nota Credito
> $trama200.=chr(13).chr(10); //Fin de trama
> 
> echo "<h2>Conexión TCP/IP</h2>\n";
> 
> /* Obtener el puerto para el servicio WWW. */
> //$puerto_servicio = getservbyname('www', 'tcp');
> $puerto_servicio = 3260;
> 
> /* Obtener la dirección IP del host de destino. */
> //$direccion = gethostbyname('172.25.10.5');
> $direccion = '172.25.10.5';
> 
> /* Crear un socket TCP/IP. */
> $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
> if ($socket === false) {
> echo "socket_create() falló: motivo: " . socket_strerror(socket_last_error()) . \
> "<br>"; die();
> } else {
> echo "OK.<br>";
> }
> 
> echo "Intentando una conexión con '$direccion' en el puerto \
> '$puerto_servicio'...<br>"; $resultado = socket_connect($socket, $direccion, \
> $puerto_servicio); if ($resultado === false) {
> echo "socket_connect() falló.<br>Motivo: ($resultado) " .
> socket_strerror(socket_last_error($socket)) . "<br>";
> } else {
> echo "OK.<br>";
> }
> 
> //$entrada = "HEAD / HTTP/1.1\r\n";
> //$entrada .= "Host: www.example.com\r\n";
> //$entrada .= "Connection: Close\r\n\r\n";
> $entrada=$trama800;
> $salida = '';
> 
> echo "Enviando Trama de Logeo...<br>";
> 
> if (!socket_write($socket, $entrada, strlen($entrada))) {
> echo "socket_connect() falló.<br>Motivo: ($resultado) " .
> socket_strerror(socket_last_error($socket)) . "<br>";
> }
> 
> 
> echo "OK.<br>Longitud trama enviada ".strlen($entrada).'<br>';
> echo "Leyendo respuesta:<br>";
> echo "Cerrando socket...<br>";
> socket_close($socket);
> echo "OK.<br>";
> die();
> 
> //while ($salida = socket_read($socket, 2048)) {
> 
> if (!$salida = socket_read($socket, 426)) {
> echo "socket_connect() falló en lectura.<br>Motivo: ($resultado) " .
> socket_strerror(socket_last_error($socket)) . "<br>";
> }
> //$salida = socket_read($socket, 426, PHP_NORMAL_READ);
> echo $salida.'<br>';
> //}
> 
> echo "Cerrando socket...<br>";
> socket_close($socket);
> echo "OK.<br>";
> 
> 
> 
> 
> 



[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic