Anda di halaman 1dari 21

Programación en Ambiente Cliente/Servidor

Unidad 2: Programación Cliente-Servidor


de Bajo Nivel: Sockets y Canales

Autor: Espinoza Espino Ariadna


Programación en Ambiente Cliente/Servidor

Programación en Ambiente Cliente/Servidor

Unidad 2

Espinoza Espino Ariadna

Ingeniería Informática

8° Semestre

Pelaez Camarena Silvestre Gustavo

Espinoza Espino Ariadna - 2- 2019


Programación en Ambiente Cliente/Servidor

Contenido
Concepto de socket ....................................... 5
Dominios y tipos de sockets .......................... 8
Creación/ implementación y supresión de
sockets ........................................................ 13
Desarrollo del lado del servidor con sockets 16
Desarrollo del lado del cliente con sockets . 19
Bibliografía .................................................. 21

Espinoza Espino Ariadna - 3- 2019


Programación en Ambiente Cliente/Servidor

Introducción
En este documento se tratara la temática de la programación en ambiente cliente servidor
de bajo nivel, en específico de los sockets y canales.

Un socket no es más que un conector que uno dos o más programas que están en la
misma red, pero que se ejecutan en distintos nodos, ya sea en el servidor o en un cliente, y
es así como los clientes de un servidor pueden hacer peticiones de recursos de otras
máquinas que están en la misma red, hacia otras máquinas, esto con el fin de aprovechar
las características que ofrecen los servidores.

También se mencionara sobre los dominios, se hablará de los tipos que se implementa y
se abordara el tema de desarrollo del lado tanto servidor como cliente con sockets.

Espinoza Espino Ariadna - 4- 2019


Programación en Ambiente Cliente/Servidor

Concepto de socket

Un socket (enchufe), es un método para la comunicación entre un programa del cliente y un


programa del servidor en una red. Un socket se define como el punto final en una conexión.
Los sockets se crean y se utilizan con un sistema de peticiones o de llamadas de función a
veces llamados interfaz de programación de aplicación de sockets (API, application
programming interface).

Un socket es también una dirección de Internet, combinando una dirección IP (la dirección
numérica única de cuatro partes que identifica a un ordenador particular en Internet) y un
número de puerto (el número que identifica una aplicación de Internet particular, como FTP,
Gopher, o WWW).

Los sockets son mecanismos de comunicación entre procesos que permiten que un proceso
hable (emita o reciba información) con otro proceso incluso estando en distintas máquinas.

Una forma de conseguir que dos programas se transmitan datos.

Un socket no es más que un "canal de comunicación" entre dos programas que corren sobre
ordenadores distintos o incluso en el mismo ordenador.

Desde el punto de vista de programación, un socket no es más que un "fichero" que se abre
de una manera especial.

Espinoza Espino Ariadna - 5- 2019


Programación en Ambiente Cliente/Servidor

Características

 Una vez abierto se pueden escribir y leer datos de él con las funciones de read() y
write().
 La forma de referenciar un socket por los procesos implicados, es mediante un
descriptor del mismo tipo que el utilizado para referenciar ficheros.
 Se podrá realizar redirecciones de los archivos de E/S estándar (descriptores 0,1 y 2)
a los sockets y así combinar entre ellos aplicaciones de la red.

Propiedades

 Fiabilidad de la Transmisión: No se pierden los datos transmitidos.


 Conservación del Orden de los Datos: Los datos llegan en el orden en que se
emitieron.
 No Duplicación de los Datos: El Dato sólo llega una vez.
 Comunicación en modo conectado: La conexión está establecida antes de iniciar la
comunicación. De este modo, la emisión desde un extremo va destinada al otro
(implícitamente).
 Conservación de los límites de los mensajes: Los límites de mensajes emitidos
pueden encontrarse o conocerse en el destino.
 Envío de Mensajes “urgentes”: Permite el envío de datos fuera de flujo o fuera de
banda. Al enviar datos fuera del flujo normal, son accesibles de inmediato.

Atributos

Un socket se caracteriza por tres atributos:

Dominio

Especifica el medio de comunicación de la red que el socket utilizará.

Protocolo

Especifica que protocolo se va a usar.

Se usa donde el mecanismo de transporte permite más de un protocolo a ser usado.

Espinoza Espino Ariadna - 6- 2019


Programación en Ambiente Cliente/Servidor

En las redes de UNIX y en los sockets de sistema de archivos no necesitamos seleccionar


otro protocolo diferente al default.

Tipo

Los protocolos de internet proveen dos niveles distintos de servicio: flujo y datagramas.

 SOCK_STREAM: Para flujo


 Son implementados en el dominio AF_INET por conexiones TCP/IP.
 Son el tipo usual en el dominio AF_UNIX.
 SOCK_DGRAM: Para datagramas
 No establecen ni mantienen una conexión.
 También existe un límite en el tamaño del datagrama que se puede enviar.
 Se transmite como un solo mensaje en la red que se puede perder, duplicar o
llegar fuera de secuencia.

A parte de estos dos, existen otros 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.”

Espinoza Espino Ariadna - 7- 2019


Programación en Ambiente Cliente/Servidor

Dominios y tipos de sockets

Dominios

Los sockets se crean dentro de un dominio de comunicación, igual que un archivo se crea
dentro de un filesystem.

El dominio de comunicación nos dice dónde se encuentran los procesos que


se van a intercomunicar.

Si los procesos están en el mismo sistema, el dominio de comunicación será AF_UNIX, si


los procesos están en distintos sistemas y éstos se hallan unidos mediante una red TCP/IP,
el dominio de comunicación será AF_INET.

Los sockets no se han diseñado solamente para TCP/IP. La idea original fue que se usase
la misma interfaz también para distintas familias de protocolos.

Espinoza Espino Ariadna - 8- 2019


Programación en Ambiente Cliente/Servidor

Tipos de dominios:

 AF_UNIX: Sockets internos de UNIX (Sockets del sistema de archivos).


 AF_INET: Protocolos de internet ARPA (Sockets de redes de UNIX).
 AF_ISO: Protocolos estándar ISO.
 AF_NS: Protocolos de redes Xerox

Tipos de sockets

Existen básicamente dos tipos:

 Los no orientados a conexión


o El programa de aplicación da la fiabilidad
 Los orientados a conexión.
o Comunicaciones fiables
o Circuito Virtual

Un socket queda definido por una dirección IP, un protocolo y un número de puerto.

En el caso concreto de TCP-IP, un socket se define por una dupla Origen – Destino.

Tanto el origen como el destino vienen indicados por un par (ip, puerto).

Sockets no orientado a la conexión

Es el llamado protocolo UDP.

 No es necesario que los programas se conecten.


 Cualquiera de ellos puede transmitir datos en cualquier momento,
independientemente de que el otro programa esté "escuchando" o no.
 Garantiza que los datos que lleguen son correctos, pero no garantiza que lleguen
todos.
 Se utiliza cuando es muy importante que el programa no se quede bloqueado.
 No importa que se pierdan datos.

Espinoza Espino Ariadna - 9- 2019


Programación en Ambiente Cliente/Servidor

Sockets orientado a la conexión

Se usa el protocolo TCP del protocolo TCP/IP, para gestionar la conexión.

 Primero hay que establecer correctamente la conexión.


 Ninguno de los dos puede transmitir datos.
 Se garantiza que todos los datos van a llegar de un programa al otro correctamente.
 Se utiliza cuando la información a transmitir es importante, no se puede perder ningún
dato.
 No importa que los programas se queden "bloqueados" esperando o transmitiendo
datos.

Arquitectura de la conexión

Servidor

Es el programa que permanece pasivo a la espera de que alguien solicite conexión con él.

 Está ejecutándose y esperando a que otro quiera conectarse a él.


 Nunca da "el primer paso" en la conexión.
 Es el que "sirve" información al que se la pida.

Cliente

Es el programa que solicita la conexión para pedir datos al servidor

 Es el programa que da el “primer paso “en la conexión.


 En el momento de ejecutarlo o cuando lo necesite, intenta conectarse al servidor.
 Es el que solicita información al servidor.

Espinoza Espino Ariadna - 10 - 2019


Programación en Ambiente Cliente/Servidor

Conexión

Para poder realizar la conexión entre ambos programas (cliente y servidor) es necesario
conocer:

 Dirección IP del servidor.


 Servicio que queremos crear / utilizar.

Funciones del servidor

Funciones del servidor en modo conectado. Las funciones utilizadas son las siguientes:

 int socket (int dominio, int tipo, int protocolo )


 crea un socket sin nombre de un dominio, tipo y protocolo específico
 dominio : AF_INET, AF_UNIX
 tipo : SOCK__DGRAM, SOCK__STREAM
 protocolo : 0 ( protocolo por defecto )
 int bind (int dfServer, struct sockaddr* direccServer, int longDirecc )
 nombra un socket: asocia el socket no nombrado de descriptor dfServer con la
dirección del socket
 almacenado en direccServer.
 La dirección depende de si estamos en un dominio AF_UNIX o AF_INET.
 int listen (int dfServer, int longCola )
 especifica el m áximo n úmero de peticiones de conexi ón pendientes.
 int accept (int dfServer, struct sockaddr* direccCliente, int* longDireccCli )
 escucha al socket nombrado “servidor dfServer” y espera hasta que se reciba
la petición de la conexión de un cliente. Al ocurrir esta incidencia, crea un
socket sin nombre con las mismas características que el socket servidor
original, lo conecta al socket cliente y devuelve un descriptor de fichero que
puede ser utilizado para la comunicación con el cliente.

Función del cliente

Espinoza Espino Ariadna - 11 - 2019


Programación en Ambiente Cliente/Servidor

Es el proceso encargado de crear un socket sin nombre y posteriormente enlazarlo con el


socket servidor nombrado. Por lo tanto, es el proceso que demanda una conexión al servidor.
Las funciones utilizadas son las siguientes:

 int socket ( int dominio, int tipo, int protocolo )


o Crea un socket sin nombre de un dominio, tipo y protocolo específico
o Dominio: AF_INET, AF_UNIX
o Tipo: SOCK__DGRAM, SOCK__STREAM
o Protocolo: 0 (protocolo por defecto )
 int connect ( int dfCliente, struct sockaddr* direccServer, int longDirecc )
o Intenta conectar con un socket servidor cuya dirección se encuentra incluida
en la estructura apuntada por direccServer.
o El descriptor dfCliente se utilizar á para comunicar con el socket servidor.
o El tipo de estructura depender á del dominio en que nos encontremos.

Espinoza Espino Ariadna - 12 - 2019


Programación en Ambiente Cliente/Servidor

Creación/ implementación y supresión de sockets

Servidor

El programa servidor realiza los siguientes pasos:

 Apertura de un socket, mediante la función socket().


 Esta función devuelve un descriptor de fichero normal, como puede devolverlo
open().
 La función socket() no hace absolutamente nada, salvo devolvernos y preparar
un descriptor de fichero que el sistema posteriormente asociar á a una
conexión en red.
 Avisar al sistema operativo de que hemos abierto un socket y queremos que asocie
nuestro programa a dicho socket.
 Se consigue mediante la función bind().
 El sistema todavía no atenderá a las conexiones de clientes, simplemente
anota que cuando empiece a hacerlo, tendrá que avisarnos a nosotros. Es en
esta llamada cuando se debe indicar el número de servicio al que se quiere
atender. Servidor (Funcionalidad)
 Avisar al sistema de que comience a atender dicha conexión de red.
 Se consigue mediante la función listen().
 A partir de este momento el sistema operativo anotará la conexión de cualquier
cliente para pasárnosla cuando se lo pidamos.
 Si llegan clientes más rápido de lo que somos capaces de atenderlos, el
sistema operativo hace una "cola" con ellos y nos los irá pasando según
vayamos pidiéndolo.
 Pedir y aceptar las conexiones de clientes al sistema operativo.
 Para ello hacemos una llamada a la función accept().
 Esta función le indica al sistema operativo que nos d é al siguiente cliente de
la cola.
 Si no hay clientes se quedar á bloqueada hasta que algún cliente se conecte.
Servidor (Funcionalidad)

Espinoza Espino Ariadna - 13 - 2019


Programación en Ambiente Cliente/Servidor

 Escribir y recibir datos del cliente, por medio de las funciones write() y read(), que son
exactamente las mismas que usamos para escribir o leer de un fichero.
 Obviamente, tanto cliente como servidor deben saber qué datos esperan
recibir, qué datos deben enviar y en qué formato.
 Puedes ver cómo se pueden poner de acuerdo en estos mensajes en el
apartado de mensajes.
 Cierre de la comunicación y del socket, por medio de la función close(), que es la
misma que sirve para cerrar un fichero.

Cliente

El programa cliente realiza los siguientes pasos:

 Apertura de un socket, como el servidor, por medio de la función socket()


 Solicitar conexión con el servidor por medio de la función connect().
 Dicha función quedará bloqueada hasta que el servidor acepte nuestra
conexión o bien si no hay servidor en el sitio indicado, saldrá dando un error.
 En esta llamada se debe facilitar la dirección IP del servidor y el número de
servicio que se desea.
 Escribir y recibir datos del servidor por medio de las funciones write() y read().
 Cerrar la comunicació n por medio de close().

Ejemplos de conexión

Espinoza Espino Ariadna - 14 - 2019


Programación en Ambiente Cliente/Servidor

 Los sockets orientados a conexion (TCP)


o Sockets están orientado a ristras (stream).
o Permite la conexión por Circuito Virtual
o Full Duplex

 Los sockets no orientados a conexión (UDP).


o Las comunicaciones correspondientes tienen la propiedad de conservar los
límites de los mensajes enviados.
o En el dominio Internet, el protocolo subyacente es el UDP.
o La transmisión es a nivel de paquetes, donde cada paquete puede seguir una
ruta distinta, no garantizándose una recepción secuencial de la información .

Espinoza Espino Ariadna - 15 - 2019


Programación en Ambiente Cliente/Servidor

Desarrollo del lado del servidor con sockets

Paso 1: Establecer variables como "host" y "puerto"

$host = "127.0.0.1";
$port = 5353;
// No Timeout
set_time_limit(0);

El número de puerto puede ser cualquier entero positivo entre 1024 -65535.

Paso 2: Crear Socket

$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

Paso 3: Enlazar el socket al puerto y al host

Aquí el recurso de socket creado está vinculado a la dirección IP y al número de puerto.

$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");

Paso 4: Comienza a escuchar el zócalo.

Después de enlazarse con IP y el servidor de puerto espera a que el cliente se


conecte. Hasta entonces sigue esperando.

$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");

Espinoza Espino Ariadna - 16 - 2019


Programación en Ambiente Cliente/Servidor

Paso 5: aceptar la conexión entrante

Esta función acepta la solicitud de conexión entrante en el socket creado. Después de


aceptar la conexión desde el socket del cliente, esta función devuelve otro recurso de
socket que es realmente responsable de la comunicación con el socket del cliente
correspondiente. Aquí " $spawn" es ese recurso de socket que es responsable de la
comunicación con el socket del cliente.

$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");

Hasta ahora, hemos preparado nuestro socket de servidor, pero la secuencia de comandos
en realidad no hace nada. Manteniendo nuestro objetivo mencionado, leeremos el mensaje
desde el socket del cliente y luego enviaremos el reverso del mensaje recibido nuevamente
al socket del cliente.

Paso 6: Lee el mensaje del socket del cliente

$input = socket_read($spawn, 1024) or die("Could not read input\n");

Paso 7: Revertir el mensaje

$output = strrev($input) . "\n";

Paso 8: Enviar mensaje al cliente socket

socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");

Cerrar el zócalo

socket_close($spawn);

Espinoza Espino Ariadna - 17 - 2019


Programación en Ambiente Cliente/Servidor

socket_close($socket);

Esto se completa con el servidor. Ahora aprenderemos a crear cliente PHP.

Código completo

// set some variables


$host = "127.0.0.1";
$port = 25003;
// don't timeout!
set_time_limit(0);
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// bind socket to port
$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");
// start listening for connections
$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");

// accept incoming connections


// spawn another socket to handle communication
$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");
// read client input
$input = socket_read($spawn, 1024) or die("Could not read input\n");
// clean up input string
$input = trim($input);
echo "Client Message : ".$input;
// reverse client input and send back
$output = strrev($input) . "\n";
socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");
// close sockets
socket_close($spawn);
socket_close($socket);

Espinoza Espino Ariadna - 18 - 2019


Programación en Ambiente Cliente/Servidor

Desarrollo del lado del cliente con sockets

Paso 1: Establecer variables como "host" y "puerto"

$host = "127.0.0.1";
$port = 5353;
// No Timeout
set_time_limit(0);

Nota: aquí el puerto y el host deben ser los mismos que los definidos en el servidor.

Paso 2: Crear Socket

$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

Paso 3: conectarse al servidor

$result = socket_connect($socket, $host, $port) or die("Could not connect toserver\n");

Aquí, a diferencia del servidor, el socket del cliente no está vinculado con el puerto y el
host. En su lugar, se conecta al socket del servidor, a la espera de aceptar la conexión del
socket del cliente. La conexión del socket del cliente al socket del servidor se establece en
este paso.

Paso 4: Escribir en el socket del servidor

socket_write($socket, $message, strlen($message)) or die("Could not send data to


server\n");

Espinoza Espino Ariadna - 19 - 2019


Programación en Ambiente Cliente/Servidor

En este paso, los datos del socket del cliente se envían al socket del servidor.

Paso 5: Lee la respuesta del servidor.

$result = socket_read ($socket, 1024) or die("Could not read server response\n");


echo "Reply From Server :".$result;

Paso 6: cerrar el zócalo

socket_close($socket);

Código completo

$host = "127.0.0.1";
$port = 25003;
$message = "Hello Server";
echo "Message To server :".$message;
// create socket
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
// connect to server
$result = socket_connect($socket, $host, $port) or die("Could not connect to server\n");
// send string to server
socket_write($socket, $message, strlen($message)) or die("Could not send data to
server\n");
// get server response
$result = socket_read ($socket, 1024) or die("Could not read server response\n");
echo "Reply From Server :".$result;
// close socket
socket_close($socket);

Espinoza Espino Ariadna - 20 - 2019


Programación en Ambiente Cliente/Servidor

Bibliografía

(s.f.). Obtenido de http://sopa.dis.ulpgc.es/ii-dso/leclinux/ipc/sockets/sockets.pdf

Ankur.Saxena17. (10 de Julio de 2012). Code Project. Obtenido de Code Project:


https://www.codeproject.com/Tips/418814/Socket-Programming-in-PHP

Jalths. (2 de Febero de 2012). Redes Zone. Obtenido de Redes Zone:


https://www.redeszone.net/2012/02/02/curso-de-php-volumen-xxiii-sockets-en-php-i/

masadelante. (s.f.). Obtenido de masadelante: http://www.masadelante.com/faqs/socket

Espinoza Espino Ariadna - 21 - 2019