Vous êtes sur la page 1sur 8

Sockets En Linux

Presentado por:
Andres Felipe Moya Rico
2010114072



Presentado a:
Ing. Luis Agudelo


Universidad del Magdalena
Facultad de Ingenieras
Ingeniera de Sistemas

Electiva profesional
Telecomunicaciones 2


Santa Marta D.T.C.H
Mayo 12 del 2014



Sockets en Linux
1. Introduccin
En la actualidad el trabajo que se realiza en un computador, en la mayora de los
casos se encuentra asociado con el concepto de redes de computadoras, como el
manejo de equipos por medio de mecanismos como el escritorio remoto, la
necesaria comunicacin en tiempo real dentro de una empresa, la constante
conexin a la red de las redes, internet, y en el caso de los usuarios del comn,
escribir una nueva entrada en su blog, actualizar su estado en alguna red social o
enviar un correo electrnico. Sin embargo muchas veces, hasta para algunos
profesionales, el proceso mediante el cual se comunican dos computadoras se
vuelve rutinario y en ocasiones transparente para el usuario.
De otra parte no quiero decir que el trabajo individual en un equipo aislado no sea
productivo, tambin es importante pero se podra explotar todo su potencial
conectado a una red.
En este trabajo se har una introduccin a los Sockets, mostrando como estos son
las primitivas bsicas de las comunicaciones actuales, sus caractersticas,
ventajas, desventajas y su implementacin en ambientes Linux ya que en muchas
ocasiones el estudiante aprende el manejo medio avanzado de las redes bajo
ambientes Windows. Sin embargo en la vida profesional es ms comn de lo que
se cree sobretodo en el mbito de las redes y las telecomunicaciones ya que la
mayora de los servidores web de grandes compaas se encuentran en este
entorno.
Al "idioma" que utilizan los ordenadores para comunicarse cuando estn en red se
le denomina protocolo. Hay muchsimos protocolos de comunicacin, entre los
cuales el ms extendido es el TCP/IP. El ms extendido porque es el que se utiliza
en Internet.
Aunque todo esto pueda parecer complicado y que no podemos hacer mucho con
ello, lo cierto es que podemos aprovecharlo para comunicar dos programas
nuestros que estn corriendo en ordenadores distintos. De hecho, con C en
Linux/Unix tenemos una serie de funciones que nos permiten enviar y recibir datos
de otros programas, en C o en otros lenguajes de programacin, que estn
corriendo en otros ordenadores de la misma red
2. El entorno Linux
Linux como lo conocemos hoy naci en el ao de 1991 cuando Linus Tolvalds
libero le primer kernel o ncleo de Linux cambiando de manera radical el mundo y
el futuro del proyecto GNU, que vena desarrollndose aos atrs y del software
libre en general.
Debido a que el kernel de Linux es software libre, se crearon una gran cantidad de
variaciones que terminaron con las conocidas distribuciones cada una de ellas
hecha con un fin especfico tanto para usuarios bsicos como para tareas
avanzadas con fines especficos como el montaje de servidores web o ftp.
Una de las caractersticas ms destacadas de este sistema operativo radica en
que su manejo se realiza por medio de una consola de comandos la cual ofrece
una gran funcionalidad para el control del sistema operativo, de los programas
instalados o de operaciones de entrada y salida. Actualmente las distribuciones de
esta SO cuentan con un manejador de ventanas de escritorio como GNOME o
KDE con el cual el trabajo en estos entornos se puede realizar de manera grfica
ofreciendo comodidad para su uso, a cambio muchas veces de funcionalidad.
3. Sockets
Una forma de conseguir que dos programas se transmitan datos, basada en el
protocolo TCP/IP, es la programacin de sockets. Un socket no es ms que un
"canal de comunicacin" entre dos programas que corren sobre ordenadores
distintos o incluso en el mismo ordenador.
Desde el punto de vista de programacin en lenguaje C, un socket no es ms que
un "fichero" que se abre de una manera especial. Una vez abierto se pueden
escribir y leer datos de l con las habituales funciones de read() y write() del
lenguaje C.
Existen bsicamente dos tipos de "canales de comunicacin" o sockets, los
orientados a conexin y los no orientados a conexin.
En el primer caso ambos programas deben conectarse entre ellos con un socket y
hasta que no est establecida correctamente la conexin, ninguno de los dos
puede transmitir datos. Esta es la parte TCP del protocolo TCP/IP, y garantiza que
todos los datos van a llegar de un programa al otro correctamente. Se utiliza
cuando la informacin a transmitir es importante, no se puede perder ningn dato
y no importa que los programas se queden "bloqueados" esperando o
transmitiendo datos. Si uno de los programas est atareado en otra cosa y no
atiende la comunicacin, el otro quedar bloqueado hasta que el primero lea o
escriba los datos.
En el segundo caso, 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. Es el llamado protocolo UDP, y
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 y no importa que se pierdan datos. Imaginemos, por ejemplo, la
transmisin en tiempo real de video o audio cuya transmisin puede permitir la
prdida de datos.
3.1 Ventajas y desventajas de la comunicacin con Sockets
El que se tengan ventajas y desventajas de los sockets, significan que existen
otras tecnologas que permiten la comunicacin entre dos computadoras y si,
existen, como por ejemplo RMI en java o CORBA e otras plataformas. As las
cosas las ventajas son las siguientes:
Rendimiento
Flexibilidad en el tipo de aplicaciones que se pueden desarrollar.
Altamente compatible entre S.O, Lenguajes, HW
Entre las desventajas tenemos:
Seleccin explicita del protocolo, puerto, direccin IP.
Manejo de tipos de datos
Programacin pesada
Cabe destacar que aunque muchas tecnologas presentan implementaciones
fciles o transparentes para el programador en el fondo utilizan sockets.
4. Arquitectura Cliente Servidor
A la hora de comunicar dos programas, existen varias posibilidades para
establecer la conexin inicialmente. Una de ellas es la utilizada en las pginas
web. Uno de los programas debe estar arrancado y en espera de que otro quiera
conectarse a l. Nunca da "el primer paso" en la conexin. Al programa que acta
de esta forma se le conoce como servidor. Su nombre se debe a que normalmente
es el que tiene la informacin que sea disponible y la "sirve" al que se la pida. Por
ejemplo, el servidor de pginas web tiene las pginas web y se las enva al
navegador que se lo solicite.
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. Su nombre se debe a que es el que solicita informacin al servidor. El
navegador de Internet pide la pgina web al servidor de Internet.
En este ejemplo, el servidor de pginas web se llama servidor porque est (o
debera de estar) siempre encendido y pendiente de que alguien se conecte a l y
le pida una pgina. El navegador de Internet es el cliente, puesto que se arranca
cuando nosotros lo arrancamos y solicita conexin con el servidor cuando
nosotros escribimos una direccin web como http://www.google.com.
Otro ejemplo es el delos juegos de Multijugador, debe haber un servidor que es el
que tiene el escenario del juego y la situacin de todos los jugadores en l.
Cuando un nuevo jugador arranca el juego en su ordenador, se conecta al servidor
y le pide el escenario del juego para presentarlo en la pantalla. Los movimientos
que realiza el jugador se transmiten al servidor y este actualiza escenarios a todos
los jugadores.

Resumiendo, servidor es el programa que permanece pasivo a la espera de que
alguien solicite conexin con l, normalmente, para pedirle algn dato. Cliente es
el programa que solicita la conexin para, normalmente, pedir datos al servidor.
5. Conexin
El desarrollo de la arquitectura cliente servidor se realiza en el lenguaje C y se
ejecuta en el entorno del SO Ubuntu as, para realizar la conexin entre en este
lenguaje se deben tener en cuenta los siguientes datos:
Direccin IP del servidor.
Cada ordenador de una red tiene asignado un nmero nico, que sirve para
identificarle y distinguirle de los dems, de forma que cuando un ordenador quiere
hablar con otro, manda la informacin a dicho nmero. El servidor no necesita la
direccin de ninguno de los dos ordenadores, al igual que nosotros, para recibir
una llamada por telfono, no necesitamos saber el nmero de nadie, ni siquiera el
nuestro.
Servicio que queremos crear / utilizar.
En un mismo ordenador pueden estar corriendo varios programas servidores,
cada uno de ellos dando un servicio distinto. Por ejemplo, un ordenador puede
tener un servidor de juegos y un servidor de pginas web corriendo a la vez.
Cuando un cliente desea conectarse, debe indicar qu servicio quiere.
Por ello, cada servicio dentro del ordenador debe tener un nmero nico que lo
identifique (como la extensin de telfono). Estos nmeros son enteros normales y
van de 1 a 65535. Los nmero bajos, desde 1 a 1023 estn reservados para
servicios habituales de los sistemas operativos (www, ftp, mail, ping, etc). El resto
estn a disposicin del programador y sirven para cosas como juegos.
5.1 El servidor
Con C en Unix/Linux, los pasos que debe seguir un programa servidor son los
siguientes:
Apertura de un socket, mediante la funcin socket(). Esta funcin devuelve
un descriptor de fichero normal, como puede devolverlo open(). La funcin
socket() no hace absolutamente nada, salvo devolvernos y preparar un
descriptor de fichero que el sistema posteriormente asociar a una
conexin 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
funcin bind(). El sistema todava 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 nmero de servicio
al que se quiere atender.
Avisar al sistema de que comience a atender dicha conexin de red. Se
consigue mediante la funcin listen(). A partir de este momento el sistema
operativo anotar la conexin de cualquier cliente para pasrnosla cuando
se lo pidamos. Si llegan clientes ms rpido de lo que somos capaces de
atenderlos, el sistema operativo hace una "cola" con ellos y nos los ir
pasando segn vayamos pidindolo.
Pedir y aceptar las conexiones de clientes al sistema operativo. Para ello
hacemos una llamada a la funcin accept(). Esta funcin le indica al
sistema operativo que nos d al siguiente cliente de la cola. Si no hay
clientes se quedar bloqueada hasta que algn cliente se conecte.
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
cmo se pueden poner de acuerdo en estos mensajes en el apartado de
mensajes.
Cierre de la comunicacin y del socket, por medio de la funcin close(), que
es la misma que sirve para cerrar un fichero.

5.2 El Cliente
Los pasos que debe seguir un programa cliente son los siguientes:
Apertura de un socket, como el servidor, por medio de la funcin
socket()
Solicitar conexin con el servidor por medio de la funcin connect().
Dicha funcin quedar bloqueada hasta que el servidor acepte nuestra
conexin o bien si no hay servidor en el sitio indicado, saldr dando un
error. En esta llamada se debe facilitar la direccin IP del servidor y el
nmero de servicio que se desea.
Escribir y recibir datos del servidor por medio de las funciones write() y
read().
Cerrar la comunicacin por medio de close().

6. Ficheros en Linux.

Hay dos ficheros en Unix/Linux que nos facilitan esta tarea, aunque hay que
tener permisos de root para modificarlos.

/etc/hosts : En este fichero hay una lista de nombres de ordenadores
conectados en red y direccin IP de cada uno. Habitualmente en el
/etc/hosts del cliente se suele colocar el nombre del servidor y su
direccin IP. Luego, desde programa, se hace una llamada a la funcin
gethostbyname(), a la que pasndole el nombre del ordenador como
una cadena de caracteres, devuelve una estructura de datos entre los
que est la direccin IP.
Imagen 1: Archivo host (Knnopix 7.2)


/etc/services : Este fichero es el equivalente a la agenda donde
tenemos apuntados los distintos departamentos/personas de la empresa
y sus nmeros de extensin telefnica. En este fichero hay una lista de
servicios disponibles, indicando nombre de servicio, nmero de servicio
y tipo (ftp/udp).

Desde programa, tanto cliente como servidor, deben hacer una llamada
a la funcin getservbyname(), a la que pasndole el nombre del servicio,
devuelve una estructura de datos entre los que est el nmero de
servicio y el tipo.

7. Bibliografa
Ubuntu Linux. Carazo Gil, Francisco Javier.198p. Ediciones de la U
Programacin de sockets en C de Unix/Linux.
http://www.chuidiang.com/clinux/index.php