Curso de PHP. Volumen XXIII : Sockets en PHP I

Escrito por Jalths
PHP
1

Volvemos otra semana más con nuestro particular Curso de PHP en Redeszone.

Si os habéis perdido algún volumen, aquí tenéis el índice del curso, por si alguno quiere encontrar un volumen pasado, o por si alguien acaba de empezar a seguir el curso y quiere ponerse al día, lo actualizamos periódicamente.

Hoy vamos a ver un tema bastante importante en la programación en general y en algunos casos particularmente en PHP, vamos a hablar de sockets.

Antes de ponernos a programar sockets , no estaría de más explicar un poco por encima sin introducirnos demasiado en el tema qué es un socket.

Un socket es una API , que permite a una computadora comunicarse con sí misma o con otra, siempre que estén unidas en red.

Realmente no son las computadoras las que se comunican entre sí, sino los procesos que hay ejecutándose en ellas. Para realizar esta tarea el socket se vale de la pila de protocolos TCP/IP.

Ya que sabemos más o menos lo que es un socket vamos a ponernos manos a la obra para implementarlos en PHP. Anteriormente ya trabajamos con sockets en Java, cliente-servidor en TCP, cliente-servidor en UDP.

Lo primero que vamos a hacer es ver en vivo cómo funciona un socket, con un pequeño ejemplo (muy simple, sin tratamiento de errores y para un sólo cliente), y luego vamos a explicar el código para que se entienda mejor.

Nota: Este código está pensado para ejecutarse en consola/terminal.
Nota2: Como la consola puede asustar a muchos (esperamos que no), vamos a intentar utilizarla sólo en este ejemplo.

En este caso se están comunicando dos máquinas. Una de las máquinas es un Kubuntu 10.10 y la otra un Backtrack 5 (Usamos ips privadas porque las máquinas están en red LAN, si no lo estuviesen habría que usar ips publicas, nombres de host,…).

Backtrack 5 se comportará como un servidor que recibirá los mensajes de Kubuntu 10.10

Nota: Hemos creído conveniente utilizar la estructura cliente-servidor para el ejemplo porque consideramos que es la forma más simple para transmitir la ida de los sockets.

Código-Cliente(Básico)


$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($sock,'192.168.0.23','8000');

socket_write($sock,"Hola",strlen("Hola"));

socket_close($sock);

echo "Fin del programa";

Código-Servidor(Básico)


$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
 socket_bind($sock,"192.168.0.23","8000");
 socket_listen($sock, 5);
 $socket=socket_accept($sock);
 $mensaje = socket_read($socket,4,PHP_NORMAL_READ);

socket_close($socket);

socket_close($sock);

Recordad que estos códigos están hechos de la manera mas básica posible, es decir tienen carencias absolutamente en todos los aspectos. En
resumidas cuentas, si vais a utilizar sockets para algo más que trastear, JAMÁS hagáis un cliente-servidor así (sin comprobaciones de errores,carentes de elementos de seguridad etc,…)

Bueno una vez comentado esto, vamos a pasar a explicar los códigos, y ver para qué se usa cada función.

Vamos a empezar con la función principal de los sockets en PHP

socket_create(int $domain , int $type , int $protocol);

Esta función es la encargada de crear un socket en PHP. Devuelve un socket por tanto tiene que estar igualada a la variable con la que vamos a representar el socket.

Los argumentos que recibe son los siguientes:
Dominio.

Entre los posibles dominios, están los siguiente:

AF_UNIX Familia de protocolos de comunicación local.
AF_INET Protocolos basados en Ipv4.
AF_INET6 Protocolos basados en Ipv6.

Tipo:

Es el tipo de socket que vamos a crear, como ya vimos anteriormente, vamos a usar los sockets básicos (los más sencillos) que son:

SOCK_STREAM Proporciona flujos de bytes orientados a conexión, secuenciados, fiables y full-duplex.

SOCK_DGRAM Socket para datagramas (no orientado a conexión, entrega no fiable).

A parte de estos dos , existen otros dejamos aquí sus especificaciones (según el manual oficial de PHP):

“SOCK_SEQPACKET Proporciona una ruta de transmisión de datos orientada a conexión secuenciada, fiable, de dos direcciones para datagramas de longitud máxima fija; se requiere un consumidor para leer un paquete entero con cada llamada de lectura.

SOCK_RAW Proporciona acceso al protocolo de red sin formato. Este tipo especial de socket se puede usar para construir manualmente cualquier tipo de protocolo. Un uso común para este socket es realizar solicitudes ICMP (como ping).

SOCK_RDM Proporcional una capa de datagramas fiable que no garantiza el orden. Lo más seguro es que esto no esté implementado en su sistema operativo.”

Protocolo:

Indica el protocolo sobre el que vamos a construir nuestro socket:

PHP soporta tres protocolos aunque realmente en el curso solo vamos a ver los siguientes 2:

TCP (Orientado a conexión , entrega fiable…).

UDP (No orientado a conexión, sin entrega fiable…).

Bien una vez explicada esta función, en la siguiente sesión vamos a ver qué hacen el resto de funciones del código para finalmente comentar que va pasando en cada línea del código en general. Podéis ir investigando sobre sockets que es un tema muy interesante, además os dejamos con lo más interesante, ver como funcionan.

Volveremos la semana que viene, esperadnos!