socket php

Responder
Avatar de Usuario
PaRi
Mensajes: 937
Registrado: 04 Feb 2007 13:41
Ubicación: Quahoc
Contactar:

socket php

Mensaje por PaRi »

Hola!

Partimos de que es la primera vez que toco un socket con php, y tengo un problemilla.
Vereis, tengo un ordenador que hace las veces de servidor de descargas y de media center (tuvimos aquí una conversación y me quedé con el Asrock ION 330 y un teclado pequeñito inalámbrico). El caso es que es un coñazo gestionarlo vía VNC y ssh.

Estuve mirando el tema de hacer un socket, para levantar sobre todo los gestores de descarga, ya que el PC arranca bastante limpio y directamente con XBMC.
Vale, tengo un socket conseguido con PHP al cual me conecto vía Telnet y ejecuto sin problemas lo que tenía pensado.

Ahora vienen los problemas. Quiero hacer una web alojada en el ordenador, con la cual pueda acceder a ese socket y hacerlo algo más dinámico que por consola, además así mato dos pájaros de un tiro y pongo los enlaces a las interfaces web de los gestores de descarga.

Estoy toqueteando php para conectarme a ese socket y ejecutar comandos. Pero solo logro conectarme al socket y leer "el saludo", el cliente se queda pensando justo despues, cuando le toca escribir y tengo que salir con ctrl+c.

La prueba debería tener estos pasos
- conectar al servidor - OK
- leer el saludo del servidor - OK
- escribir al servidor - NO
- leer la respuesta del servidor - ¿?
- desconectar del servidor -¿?

Además al salir del cliente con ctrl+c el servidor me da un error como que no puede leer (claro está a la espera del mensaje)

Código: Seleccionar todo

<?php
error_reporting(E_ALL);


/* Puerto */
$service_port = "1111";
/* IP */
$address = "192.168.1.40";


/* Creamos TCP/IP socket. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
} else {
    echo "OK.\n";
}

echo "Attempting to connect to '$address' on port '$service_port'... ";
$result = socket_connect($socket, $address, $service_port);
if ($result === false) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "OK.\n";
}

/* Leemos del socket */
echo "Leyendo Saludo:\n\n";
$out = socket_read($socket, 2048);
echo $out;

/***** hasta aquí es donde llega *****/

/* Escribimos en el socket */
$msg = "Prueba de escritura";    
socket_write($socket, $msg, strlen($msg));

/* leemos la contestación del socket */
$out = socket_read($socket, 2048);
echo $out;

echo "Closing socket...";
socket_close($socket);
echo "OK.\n\n";
?>
Imagen

Gracias.
Imagen ImagenImagen
Avatar de Usuario
PaRi
Mensajes: 937
Registrado: 04 Feb 2007 13:41
Ubicación: Quahoc
Contactar:

Re: socket php

Mensaje por PaRi »

Autosolucionado. He usado otras funciones para socket que he encontrado y me funciona tal y como quiero. Solo me queda meter en cada página el cliente con el comando correspondiente.

Os pego los códigos, son muy sencillo, pero tal vez a alguien le puedan valer.

Servidor, tiene que estar corriendo en la máquina (php socket.php), y lo que hace es simplemente estar a la escucha en la ip y el puerto que se indican y cuando recibe un comando que concuerda con los casos realiza la acción.

Código: Seleccionar todo

<?
error_reporting(E_ALL);
set_time_limit(0);

/* ip y puerto de escucha */
$ip = 'localhost';
$puerto = 1111;

/* creamos el socket y lo ponemos a la escucha */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$retorno = socket_bind($socket, $ip, $puerto);
$retorno = socket_listen($socket, 5);

echo "CORRIENDO SOCKET EN " . $ip . " " . $puerto . "\n";

/* bucle de escucha */
while (true) {
     $sock_acepted = socket_accept($socket);
     $buf = socket_read($sock_acepted, 2048);

     if ($buf == 'jd') {
	    exec("/home/pari/Escritorio/jd.sh");
		echo "\njd\n";
        }
	if ($buf == 't') {
	    exec("transmission");
		echo "\nt\n";
        }
	if ($buf == 'jdt') {
	    exec("/home/pari/Escritorio/jd.sh&transmission");
		echo "\njdt\n";
        }
	if ($buf == 'matar') {
	    exec("/home/pari/matar.sh xbmc.bin");
		echo "\nmatar\n";
        }
	if ($buf == 'xbmc') {
	    exec("xbmc");
		echo "\nxbmc\n";
        }
	if ($buf == 'salir') {
		break;
        }
}
/* cuando salgamos del bucle cerramos el socket */
socket_close($socket);

echo "Server por PaRi\n\n"
?>
Cliente, se puede adherir a una web y se conecta al servidor con ip y puerto especificado y le pasa un comando.

Código: Seleccionar todo

<?php

/* dirección con la que vamos a contactar */
$ip = "localhost";
$puerto = 1111;

/* conectamos con el server */
$connect = fsockopen($ip,$puerto);
if ($connect) {
		/* enviamos la orden */
     	$com = "comando a ejecutar";
        fwrite($connect, $com);
		echo "el comando enviado es: " . $com;

} else {
     echo "Error en la conexion\n";
}

echo "Cliente por PaRi\n";
?>
un saludo.
PD: ahora me voy a seguir con lo que debería estar haciendo... estudiar xDDDD
Imagen ImagenImagen
Avatar de Usuario
Zoltelder
Mensajes: 4727
Registrado: 02 Feb 2007 19:59
Ubicación: Badajoz

Re: socket php

Mensaje por Zoltelder »

Personalmente ni idea de lo que preguntabas, nunca he trabajado con sockets en php, pero bueno, por lo menos lo solucionastes rapido :D
Que vaya bien la cosa y los estudios Pari
Icono de PC  PC Gamer Desplegar firma
  • Procesador
    Intel i5 750 3.8GHz
  • Placa base
    Asus P7P55D PRO
  • RAM
    GSkill Trident 4GB 1600Mhz
  • Tarjeta gráfica
    Gigabyte 5850
  • Disco Duro
    SSD Crucial M4 128GB / WD CB 1TB / WD CB 500GB
  • Unidad Óptica
    -
  • Refrigeración
    Noctua NH-U12P SE2
  • Fuente alimentación
    Corsair HX 650
  • Caja
    Antec Twelve Hundred
  • Sonido
    Creative X-Fi Titanium
  • Sistema operativo
    Windows 7 Ultimate 64 bits
  • Monitor
    LG W2453V-PF
  • Teclado
    Logitech Wave
  • Ratón
    Logitech G9x
  • Otros
    Sennheiser PC350
  • Otros
    -
Ocultar
Avatar de Usuario
PaRi
Mensajes: 937
Registrado: 04 Feb 2007 13:41
Ubicación: Quahoc
Contactar:

Re: socket php

Mensaje por PaRi »

NOTA: es mejor recoger el comando vía POST o GET y no escribirlo a pelo en al código, así lo que cambiarán son los enlaces y no los códigos.
Pero bueno eso ya lo dejo para cuando me ponga con la web que será dentro de un par de semanas.

Gracias Zoltelder
Imagen ImagenImagen
Avatar de Usuario
SoTA
Mensajes: 3394
Registrado: 03 Feb 2007 12:25

Re: socket php

Mensaje por SoTA »

Tiene buena pinta!

¿Se te dió por programarlo porque te interesó el tema o es que no encontraste por la web ningún software que hiciera eso?

¿Cuando lo tengas terminado me lo pasas? Me gustaría probarlo.

Un saludo Pari :)
Avatar de Usuario
PaRi
Mensajes: 937
Registrado: 04 Feb 2007 13:41
Ubicación: Quahoc
Contactar:

Re: socket php

Mensaje por PaRi »

Pues no encontré nada que me convenciese, y como dije estoy bastante cansado de VNC.
Basicamente el ordenador del salón ahora arranca con XBMC ( para que mi familia sepa encenderlo y ponerse pelis, etc) y con el servidor socket "$ php socket.php"

Entonces ahora para gestionar las cosas que hago normalmente, entro via web al servidor (tengo apache y php) y tengo un index con links preparados del tipo

http://192.168.1.40/socket2/cliente.php?orden=jd
(añadí el cambio en el cliente que dije de coger la órden vía GET)
$com = $_GET["orden"];


entonces al acceder al servidor con esa órden, se arranca jdownloader y puedo acceder al interface web del mismo http://192.168.1.40:8765/ y así para todos los comandos que tengo "preparados". QUITANDOME POR FÍN la gestión de la máquina por VNC

Así que en esencia el código es el que hay escrito, con algún que otro retoque nada más.
No se si me he explicado SoTA...

PD: La única pega es que el socket es de una sola conexión, es decir, hasta que una órden no acaba de ejecutarse no puedes ejecutar siguiente, por eso puse una orden que es jdt (suena mal lo sé) que arranca jdownloader y transmission a la vez.
Tambien puse las órdenes de levantar y matar XBMC porque es el programa más usado en ese ordenador y si quiero cargar películas nuevas que acabo de meter, en vez de reiniciar el PC paro y arranco de nuevo XBMC.
Última edición por PaRi el 09 Jun 2010 10:48, editado 1 vez en total.
Imagen ImagenImagen
Avatar de Usuario
PaRi
Mensajes: 937
Registrado: 04 Feb 2007 13:41
Ubicación: Quahoc
Contactar:

Re: socket php

Mensaje por PaRi »

A parte de todo esto, se puede hacer un socket para que sea una consola "real" y no una consola remota, que es la gracia de todo esto, ya que por consola remota no puedes ejecutar programas como jdownlader, solo órdenas básicas. Que era mi problema.

Entonces modificando el servidor para que cada vez que le llegue una órden la ejecute exec($buf); se convierte como digo en una consola "real" en la propia máquina.

En mi servidor solo admite ciertas órdenes para, de algún modo capar las posibilidades..

Otra ventaja que tengo al gestionar el ordenador vía web, es que me puedo conectar desde fuera de mi casa para añadir o ver como van las descargas, cosa que con VNC era prácticamente imposible con mi conexión..
Imagen ImagenImagen
Avatar de Usuario
SoTA
Mensajes: 3394
Registrado: 03 Feb 2007 12:25

Re: socket php

Mensaje por SoTA »

Nunca he hecho nada del estilo, asi que no te puedo ayudar, pero si vuelves a intentarlo no dejes de comentarnos tus progresos :)
Responder