Foros del Web » Programando para Internet » PHP »

PhP, Sockets y XML

Estas en el tema de PhP, Sockets y XML en el foro de PHP en Foros del Web. Saludos, primer mensaje en el foro y ya con dudas, en fin... La cosa es que intento conectarme a un servicio externo a mi servidor, ...
  #1 (permalink)  
Antiguo 14/05/2010, 05:28
 
Fecha de Ingreso: mayo-2010
Mensajes: 3
Antigüedad: 9 años, 9 meses
Puntos: 1
PhP, Sockets y XML

Saludos,

primer mensaje en el foro y ya con dudas, en fin...

La cosa es que intento conectarme a un servicio externo a mi servidor, mediante SSL, la conexión tiene que mantenerse abierta y por allí transmitir comandos. Los comandos, son XML que luego trataremos y demás.

El primer comando en enviarse es <hello>, si la conexión está abierta, nos devuelve un <greetings>, hasta aquí no hay problema.

El segundo comando en enviarse es un <login>, no sé si funciona o no, porque al leer la respuesta, el puntero del buffer está apuntando a la última posición (la de la lectura del <hello>, un EOF) por lo que no lee nada y me devuelve cadena vacia.

He intentado hacer un rewind() pero me dice que no es posible.

A alguien se le ocurre alguna idea? Os pongo por aquí el código que estoy usando a ver si le veis alguna utilidad...

Código PHP:
public function doTransaction(){
            
    echo "Conexion SSL\n";

    /* Obtener el puerto para el servicio WWW. */
    $port = "33128";

    /* Obtener la direccion IP del host de destino. */
    $host = "195.234.53.108";
            
    /* Obtenidos del archivo de configuracion */
    //$host = gethostbyaddr(__EURID_HOST__);
    //$port = __EURID_PORT__;
             
    $errno = 440;
    $errstr = " No encontrado.";

    /* compose XML request */ 
    $entrada = "<?xml version="1.0\" encoding=\"iso-8859-1\"?>".
        
"<epp xmlns=\"http://www.eurid.eu/xml/epp/epp-1.0\xmlns:".
                                
"xsi=\\\"http://www.w3.org/2001/XMLSchema-instance".
        
"xsi:schemaLocation=\"http://www.eurid.eu/xml/epp/epp-1.0 epp-1.0.xsd\">".
        
"<hello/>".
        
"</epp>";

    echo 
"Generados ".strlen($entrada)." bytes...\n\n";
    echo 
$entrada."\n\n";
            
    if (
strlen($entrada)/1000 1)        {    $entrada strlen($entrada).$entrada;        }
    else if (
strlen($entrada)/100 1)    {    $entrada "0".strlen($entrada).$entrada;    }
    else if (
strlen($entrada)/10 1)    {    $entrada "00".strlen($entrada).$entrada;    }
    else                 {    
$entrada "000".strlen($entrada).$entrada; }
                        
    
/* ABRIENDO CONEXION */
    
$fp pfsockopen("ssl://".$host$port$errno$errstr); 
    if (!
$fp) { 
           echo 
"$errstr ($errno)<br/>\n"
        echo 
$fp
        exit();
    } 
            
    echo 
"Enviando petici&oacute;n XML HEAD...".strlen($entrada)." bytes..."
    
fputs($fp$entrada); 
            
                echo 
"Leyendo respuesta:\n\n";
        
$salida '';
                while (!
feof($fp)) { 
                
$salida .= fgets($fp128); 
                   }
                echo 
"Posicion del puntero de lectura: ".ftell($fp)."\n\n";
            
                echo (
"<pre>");
     
var_dump($salida);
     echo (
"</pre>");
            
                   
/* COMENZAMOS CON EL LOGIN */
            
                  
$entrada "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>".
        
"<epp xmlns=\"http://www.eurid.eu/xml/epp/epp-1.0\"".
                       
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"".
        
"xsi:schemaLocation=\"http://www.eurid.eu/xml/epp/epp-1.0 epp-1.0.xsd\">".
        
"<command>".
        
"<login>".
        
"<clID>".__EURID_ID__."</clID>".
        
"<pw>".__EURID_PASSWORD__."</pw>".
        
"<options>".
        
"<version>1.0</version>".
        
"<lang>en</lang>".
        
"</options>".
        
"<svcs>".
        
"<objURI>http://www.eurid.eu/xml/epp/contact-1.0</objURI>".
        
"<svcExtension>".
        
"<extURI>http://www.eurid.eu/xml/epp/build/20051012</extURI>".
        
"</svcExtension>".
        
"</svcs>".
        
"</login>".
        
"</command>".
        
"</epp>";
                   echo 
"Generados ".strlen($entrada)." bytes...\n\n";
    echo 
$entrada."\n\n";
            
    if (
strlen($entrada)/1000 1)        {    $entrada strlen($entrada).$entrada;        }
    else if (
strlen($entrada)/100 1)    {    $entrada "0".strlen($entrada).$entrada;    }
    else if (
strlen($entrada)/10 1)    {    $entrada "00".strlen($entrada).$entrada;    }
    else                {    
$entrada "000".strlen($entrada).$entrada; }
            
    echo 
"Enviando petici&oacute;n XML HEAD...".strlen($entrada)." bytes..."
        
fputs($fp$entrada); 
         
    echo 
"Posicion del puntero de lectura: ".ftell($fp)."\n\n";
    echo 
"Leyendo respuesta:\n\n";
        
$salida '';
        while (!
feof($fp)) { 
        
$salida .= fgets($fp128); 
        }
    echo 
"Posicion del puntero de lectura: ".ftell($fp)."\n\n";
        
    echo (
"\n\n");
    
var_dump($salida);
    echo (
"\n\n");
            
    echo 
"\n\nCerrando socket...";
    
fclose($fp); 
    echo 
"OK.\n\n";
                
    
$response strstr($salida'<?xml');
    return 
$response;
}

Última edición por Asgaard; 14/05/2010 a las 06:27
  #2 (permalink)  
Antiguo 14/05/2010, 08:20
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 9 meses
Puntos: 1517
Respuesta: PhP, Sockets y XML

¿por qué no usas mejor DOM o SimpleXML para recorrerlo?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 14/05/2010, 09:26
 
Fecha de Ingreso: mayo-2010
Mensajes: 3
Antigüedad: 9 años, 9 meses
Puntos: 1
Respuesta: PhP, Sockets y XML

¿Para recorrer?

nononono si con el XML no tengo problema alguno, el problema es que al lanzar el XML al servidor externo no recibo respuesta, el puntero se me queda apuntando a la misma posición, y soy incapaz de leer la respuesta de la segunda petición.

La cosa es que tengo que mantener una sesión socket abierta. Lanzar una petición, recibir respuesta, y sin cerrarla, lanzar otra petición, y recibir respuesta. Y la verdad que me estoy volviendo ya algo loco con esto porque no pillo respuesta.

En el momento que reciba el XML de respuesta no tengo problema en pasarlo a un array :)

gracias de todos modos abimaelrc.
  #4 (permalink)  
Antiguo 14/05/2010, 09:33
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 10 años, 9 meses
Puntos: 1517
Respuesta: PhP, Sockets y XML

Pero, y tratar de crear el XML con DOM no te resulta. O sea si estás indicando que no te deja por el puntero, por qué no intentas añadirlo con DOM. Solo necesitas indicar donde debe añadir y listo. Algo así de sencillo
Código PHP:
Ver original
  1. <?php
  2. $xml = '<?xml version="1.0"?>
  3. <note>
  4.    <to>FDW</to>
  5.    <from>DOM</from>
  6. </note>';
  7. $dom = new DOMDocument();
  8. $dom->loadXML($xml);
  9.  
  10. $note = $dom->getElementsByTagName('note')->item(0);
  11.  
  12. $newElement = $dom->createElement('where','f18');
  13. $note->appendChild($newElement);
  14.  
  15. echo $dom->saveXML();
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 14/05/2010 a las 09:41

Etiquetas: pfsockopen, sockets, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:02.