Ver Mensaje Individual
  #1 (permalink)  
Antiguo 20/02/2014, 10:18
AJDC
 
Fecha de Ingreso: agosto-2003
Mensajes: 324
Antigüedad: 20 años, 9 meses
Puntos: 1
Socket en php. Recibir xml

Hola.
Estoy con un proyecto en el que tengo que crear un socket que esté a la escucha de envíos de información de terceros.
Concretamente se espera que se reciban datos en formato xml.
Una vez trabajados esos datos, tengo que responder con un xml, y su correspondiente header, sobre todo por el status (200, 400, ...).

El php del socket (socket.php):
Código PHP:
<?php
set_time_limit
(0);
$socket=socket_create(AF_INET,SOCK_STREAM,0);
/*0 - acepta cualquier conexion de cualquier ip*/
$direccion=0;
$puerto=4545;
socket_bind($socket$direccion,$puerto);
socket_listen($socket);
 
$tamaño=2048;
while(
1){
    
$cliente=socket_accept($socket);
    
$buffer=socket_read($cliente$tamaño); //leemos mensaje del cliente

    
$ret "POST " $page " HTTP/1.1 400 Bad Request\r\n";
    
$ret .= "Host: " $host "\r\n";
    
$ret .= "Accept-Language: es-ES\r\n";
    
$ret .= "Content-Type: text/xml; charset=UTF-8\r\n";
    
$ret .= "User-Agent: " $_SERVER["HTTP_USER_AGENT"] . "\r\n";
    
$ret .= "Connection: Close\r\n\r\n";

    
$ret .= $buffer;
    
socket_write($cliente$ret); //escribimos el retorno
    
socket_close($cliente); //cerramos cliente
}
//socket_close=>cierra el recurso socket dado por $socket
socket_close($socket);

?>
Archivo de prueba (prueba.php):
Código PHP:
<?php
$host
="172.26.10.21";
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
$puerto=4545;
$conexion=socket_connect($socket,$host,$puerto);
$tamaño=2048;
if(
$conexion){
    
$buffer="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><root>index</root>";
    
$salida='';
    
socket_write($socket,$buffer);
 
    while(
$salida=socket_read($socket,$tamaño)){
        echo 
$salida;
    }
 
    }else{
    echo 
"\n la conexion TCP no se a podido realizar, puerto: ".$puerto;
    }
 
socket_close($socket); //cierra el recurso socket dado por $socket
?>

Si hago una prueba con otro archivo php (prueba.php) "mío" va bien.... pero...
¿A dónde tiene que enviarme el xml la aplicación del tercero?
¿Directamente a mi archivo socket.php o a un archivo "intermedio" php de mi servidor que vuelque los datos a mi socket y luego los retorne?
La aplicación tercera se que está montada en Ruby... no sé más.

Supongo que directamente al socket.php pero aunque me aseguran que me envía un xml, no recibo nada en la variable
Código PHP:
buffer=socket_read($cliente$tamaño); 
¿Algún consejo o ayuda?
Gracias