martes, 8 de noviembre de 2011

Programación de sockets en C de Unix/Linux.


1.- INTRODUCCIÓN A LOS SOCKETS

Una forma de conseguir que dos programas se transmitan datos, basada en el protocolo TCP/IP, es la programación de sockets. Un socket es un "canal de comunicación" entre dos programas que corren sobre ordenadores distintos o en el mismo.

Desde el punto de vista de programación, un socket no es más que un "fichero" que se abre de una manera especial. Una vez abierto se pueden escribir y leer datos de él.

Existen básicamente dos tipos de sockets:

· Orientados a conexión: ambos programas deben conectarse entre ellos con un socket y hasta que no esté establecida la conexión, ninguno puede transmitir datos. Se trata de TCP y garantiza que todos los datos van a llegar correctamente.

· No orientados a conexión: no es necesario que los programas se conecten. Cualquiera puede transmitir datos en cualquier momento, independientemente de que el otro esté escuchando o no. Es el protocolo UDP, y garantiza que los datos sean correctos, pero no que lleguen todos.

A la hora de comunicar dos programas, existen varias posibilidades para establecer la conexión. Uno de los programas debe estar arrancado y en espera de que otro quiera conectarse a él, servidor.

El otro programa es el que da el primer paso. En el momento de arrancarlo o cuando lo necesite, intenta conectarse al servidor. Este programa se denomina cliente.


2.- LA CONEXIÓN

Para poder realizar la conexión entre ambos programas son necesarias varias cosas:

· Dirección IP del servidor: cada ordenador de una red tiene asignado un número único, que sirve para identificarle y distinguirle de los demás, de forma que cuando un ordenador quiere hablar con otro, manda la información a dicho número.

· Servicio que queremos crear/utilizar: en un mismo ordenador pueden estar corriendo varios programas servidores dando servicios distintos. Cuando un cliente desea conectarse, debe indicar qué servicio quiere. Por ello, cada servicio dentro del ordenador debe tener un número único que lo identifique.


3.- EL SERVIDOR

Con C en Unix/Linux, los pasos que debe seguir un programa servidor son los siguientes:

· Apertura de un socket, mediante la función socket(). Esta función devuelve y prepara 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. Es en esta llamada cuando se debe indicar el número de servicio al que se quiere atender.

· 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 a través de 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.

· Escribir y recibir datos del cliente, por medio de las funciones write() y read(). Tanto cliente como servidor deben saber qué datos esperan recibir, qué datos deben enviar y en qué formato.

· Cierre de la comunicación y del socket, por medio de la función close().


4.- EL CLIENTE

Los pasos que debe seguir un programa cliente son los siguientes:

· Apertura de un socket 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á 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().


5.- FICHEROS UNIX/LINUX IMPLICADOS

Para la programación de socket se pone la dirección IP y el número de servicio. Sin embargo, esto no es lo más cómodo ni lo más portable de unos ordenadores a otros. Hay dos ficheros en Unix/Linux que nos facilitan esta tarea:

· /etc/hosts: hay una lista de nombres de ordenadores conectados en red y dirección IP de cada uno. El cliente coloca el nombre del servidor y su dirección IP. Luego, desde programa, se hace una llamada a la función gethostbyname(), a la que pasándole el nombre del ordenador, devuelve una estructura de datos entre los que está la dirección IP.

· /etc/services: hay una lista de servicios disponibles, indicando nombre de servicio, número de servicio y tipo (ftp /udp). Desde programa, tanto cliente como servidor, deben hacer una llamada a la función getservbyname(), a la que pasándole el nombre del servicio, devuelve una estructura de datos entre los que está el número de servicio y el tipo.

6.- BIBLIOGRAFÍA

Toda esta información está obtenida del siguiente enlace: http://www.chuidiang.com/clinux/sockets/sockets_simp.php. Además, se pueden consultar ejemplos de código que es de gran ayuda.

Un excelente libro para programación avanzada en C sobre entorno Unix es "UNIX, Programación avanzada" de Fco. Manuel Márquez García, editorial ra-ma.

No hay comentarios:

Publicar un comentario en la entrada

Search Site

 
  • Páginas vistas en total