Foros del Web » Programando para Internet » PHP »

sockets UNIX

Estas en el tema de sockets UNIX en el foro de PHP en Foros del Web. tengo la siguiente clase base (mostrando solo variables y datos relevantes) Código PHP: abstract class  Socket_Layer   {     protected  $socket                 =  null ;     protected  $socket_domain     =  AF_INET ...
  #1 (permalink)  
Antiguo 16/12/2004, 12:21
Avatar de sism82  
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 14 años, 1 mes
Puntos: 1
sockets UNIX

tengo la siguiente clase base (mostrando solo variables y datos relevantes)
Código PHP:
abstract class Socket_Layer  {

    protected 
$socket                null;
    protected 
$socket_domain    AF_INET;
    protected 
$socket_type        SOCK_STREAM;
    protected 
$socket_port         8550;
    protected 
$socket_address   '127.0.0.1';
    protected 
$string_date          'Y-m-d H:i:s';
    protected 
$max_read_bytes  2048;
    protected 
$limit_time            0;
    
    
//sets undefined execution time for the script
    
public function __construct() {
        
set_time_limit($this->limit_time);
        return 
true;
    }

    final public function 
open_socket() {
        
$socket = @socket_create($this->socket_domain,$this->socket_type,0);
        if ( 
$socket !==  false ) {
            
$this->socket $socket;
            return 
true;
        } else {
            
$errno socket_last_error();
            
$erstr socket_strerror($errno);
            
$this->console_message("Unable to create socket: $erstr");
            die();
        }
    }


luego la siguiente clase para servidor

Código PHP:
include_once('Socket_Layer.php');
abstract class 
Socket_Server extends Socket_Layer {

    protected 
$socket_clients   = Array();
    protected 
$read_sockets     = Array();
    
    public function 
__construct() {
        
parent::__construct();
        return 
true;
    }
    
    abstract protected function 
send_response($socket,$response,$response_args = Array()); //every server has to send response
    
    
final public function start_server() {
        
$this->listen();
        
$this->console_message("Server started.");
        
$this->console_message("Socket IP Address: {$this->socket_address}.");
        
$this->console_message("Socket Port:{$this->socket_port}");
        while ( 
true ) {
            
$this->fill_read_sockets();
            
$this->console_message("Waiting...");
            
$ready socket_select($this->read_sockets,$write null,$except null,null);
            
$this->add_client();
            
$this->read_input();
            
$this->handle_data();
        }
    }
    
    final protected function 
listen() {
        if ( [email protected]
socket_bind($this->socket,$this->socket_address,$this->socket_port) ) {
            
$errno socket_last_error();
            
$erstr socket_strerror($errno);
            
$this->console_message("Unable to bind socket to {$this->socket_address}:{$this->socket_port}: $erstr.");
            die();
        } elseif ( [email protected]
socket_listen($this->socket) ) {
            
$errno socket_last_error();
            
$erstr socket_strerror($errno);
            
$this->console_message("Unable to listen socket.");
            die();
        } else {
            return 
true;
        }
    } 
la clase que da implementacion especifica :

Código PHP:
include_once('Socket_Server.php');
include_once(
'Config_Master.php');
include_once(
'configuration_protocol.php');
final class 
Configuration_Server extends Socket_Server
     
implements configuration_protocol {

    private 
$config_master    null;
    
    public function 
__construct() {
        
parent::__construct();
        
$this->config_master = new Config_Master();
        return 
true;
    }

    public function 
start() {
        
parent::start_server();
        return 
true;
    } 
finalmente el script que manda llamar todo esto:

Código PHP:
#!/usr/bin/php -q
include_once('asterisk/Configuration_Server.php');
$server = new Configuration_Server();
$server->open_socket();
$server->start();
die(
"Quitting PHP Socket_Server\n"); 
cuando el socket es tipo AF_INET todo funciona perfectamente. Sin ebargo cuando cambio la propiedad socket_domain de la clase base a AF_UNIX, la aplicación indica:
Código:
>> Unable to bind socket to 127.0.0.1:8550: Address already in use.
Ideas de por que este error cuando cambio el tipo de socket? para mi es casi necesario AF_UNIX por que las comunicaciones serań unicamente internas. No tiene objeto usar AF_INET.

gracias.
  #2 (permalink)  
Antiguo 18/02/2005, 00:01
 
Fecha de Ingreso: enero-2004
Ubicación: This Planet
Mensajes: 46
Antigüedad: 13 años, 11 meses
Puntos: 0
Código HTML:
cuando el socket es tipo AF_INET todo funciona perfectamente. Sin ebargo cuando cambio la propiedad socket_domain de la clase base a AF_UNIX, la aplicación indica:
Unable to bind socket to 127.0.0.1:8550: Address already in use.
Ese error ocurre cuando el puerto aun esta abierto, sencillamente despues que ejecutastes tu programa e inmediatamente vuelves a correrlo te va a salir ese mensaje.
A mi me ha ocurrido lo mismo y solo espero un momento y vuelvo a ejecutar mi aplicacion y problema resuelto, sencillamente el puerto no se libera inmediatamente, eso es lo que he concluido con unas pruebas que estoy haciendo.
__________________
:cool: Hagas lo que hagas, que sea eficiente :arriba:
  #3 (permalink)  
Antiguo 18/02/2005, 00:02
 
Fecha de Ingreso: enero-2004
Ubicación: This Planet
Mensajes: 46
Antigüedad: 13 años, 11 meses
Puntos: 0
Código PHP:
cuando el socket es tipo AF_INET todo funciona perfectamenteSin ebargo cuando cambio la propiedad socket_domain de la clase base a AF_UNIXla aplicación indica:
Unable to bind socket to 127.0.0.1:8550Address already in use. 

Ese error ocurre cuando el puerto aun esta abierto, sencillamente despues que ejecutastes tu programa e inmediatamente vuelves a correrlo te va a salir ese mensaje.
A mi me ha ocurrido lo mismo y solo espero un momento y vuelvo a ejecutar mi aplicacion y problema resuelto, sencillamente el puerto no se libera inmediatamente, eso es lo que he concluido con unas pruebas que estoy haciendo.
__________________
:cool: Hagas lo que hagas, que sea eficiente :arriba:
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 19:55.