RC [entrega] [Practica 1] [Practica 2] [Practica 3] [Practica 4] [Practica 5] [info ssh] [info git]

Práctica 2 - Iniciación Sockets

Objetivos

En esta práctica aprenderemos a usar sockets en un sistema UNIX con herramientas de la línea de comandos y a enviar información directamente programando en C.

Objetivo 1: herramientas de red en UNIX

Vamos a utilizar herramientas básicas de las que dispone un sistema UNIX. Debes ser capaz de demostrar al profesor qué puedes hacer cualquiera de las tareas indicadas. Consulta en el man cómo se usa el comando ifconfig. ¿Cuál es la dirección IP que tiene tu ordenador?

Consulta en el man cómo se usa el comando ping. En teoría veremos cómo funciona ping a nivel de red.

Consulta en el man o busca en internet cómo se usa el comando nc.

Deberias ser capaz de hacer las siguientes cosas.

Objetivo 2: sockets TCP cliente en C

Realizar en C un programa que permita enviar un dato a un servidor TCP.

El programa tiene que cumplir la siguiente especificación:

FORMATO
    envia <direccion_ip> <puerto> <mensaje>


DESCRIPCIÓN
    Establece una conexión TCP a <direccion_ip> y <puerto> indicados y envía <mensaje>. Tras esto, cierra la conexión y sale del programa sin esperar respuesta del servidor.


    El <mensaje> puede ser una única palabra o varias entre comillas.
    La <direccion_ip> será del tipo 10.1.1.121, no puede ser un nombre simbólico.


EJEMPLOS
    envia 10.1.1.112 5000 hola
    envia 10.1.1.133 4500 “mensaje con varias palabras”

Para probarlo bastará con crear un servidor TCP con nc y lanzar el programa que habéis creado contra él.

Para poder realizar correctamente el programa, además de las funciones de sockets que se han visto en clase, será necesario familiarizarse con diversas funciones de manejo de cadenas y direcciones IP. Se recomienda mirar el manual de sprintf y de inet_ntoa.

Una vez comprobado que el programa cumple los requisitos, puedes hacer una demostración con nc y habrás cumplido este objetivo.

Elegir una máquina del laboratorio obtener su direccion IP usando ifconfig

$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.1.1.14  netmask 255.255.0.0  broadcast 10.1.255.255
...              ^
...           en esta es la 10.1.1.14 por ejemplo

En la maquina lanzar un servidor que escuche una conexión TCP en un puerto, por ejemplo el 20000

nc -l 20000

En otra máquina lanzar el programa envia contra ese servidor

./envia 10.1.1.14 20000 'ahi va el mensaje'

Asi puede comprobar si el servidor recibe el mensaje.

Objetivo 3: envío UDP en C

Realizar en C un programa que permita enviar un datagrama a un servidor UDP.

El programa tiene que cumplir la siguiente especificación:

FORMATO
    envia_udp <direccion_ip> <puerto> <mensaje>


DESCRIPCIÓN
    Envía el <mensaje> en un datagrama UDP a <direccion_ip> y <puerto> indicados. Tras esto sale del programa sin esperar respuesta del servidor.


    El <mensaje> puede ser una única palabra o varias entre comillas.
    La <direccion_ip> será del tipo 10.1.1.121, no puede ser un nombre simbólico.


EJEMPLOS
    envia_udp 10.1.1.112 5000 hola
    envia_udp 10.1.1.133 4500 “mensaje con varias palabras”

Para probarlo bastará con crear un servidor UDP con nc y lanzar el programa que habéis creado contra él. Una vez comprobado que el programa cumple los requisitos, puedes hacer una demostración con nc y habrás cumplido este objetivo.

En la maquina elegida lanzar un servidor que escuche datagramas UDP en un puerto, por ejemplo el 20000

nc -u -l 20000

En otra máquina lanzar el programa envia contra ese servidor

./envia_udp 10.1.1.14 20000 'ahi va el mensaje'

Asi puede comprobar si el servidor recibe el mensaje.

Objetivo 4: recepción UDP en C

Realizar en C un programa que permita recibir un datagrama en un servidor UDP.

El programa tiene que cumplir la siguiente especificación:

FORMATO
    recibe_udp <puerto>


DESCRIPCIÓN
    El programa debe crear un socket UDP en el puerto indicado y escuchar indefinidamente los datagramas UDP que lleguen. Cada vez que reciba uno lo imprimira indicando la direccion y el puerto desde le que llegan.



EJEMPLOS
    recibe_udp 5000

RESULTADO
    $ recibe_udp 5000
    Escuchando en UDP 5000
    > Recibido de 10.1.1.23 puerto 41232
    Hola
    > Recibido de 10.1.1.41 puerto 42421
    Eoooo que pasa por ahi
    

Para probarlo bastará con lanzar el programa en un puerto y enviarle datagramas con nc o bien con el programa anterior. Una vez comprobado que el programa cumple los requisitos, puedes hacer una demostración con nc y habrás cumplido este objetivo.

En la maquina elegida lanzar el servidor que escuche datagramas UDP en un puerto, por ejemplo el 20000

./recibe_udp 20000

En otra máquina lanzar el programa envia contra ese servidor o enviarle mensajes con nc

./envia_udp 10.1.1.14 20000 'ahi va el mensaje'
nc -u 10.1.1.14 20000

Asi puede comprobar si el servidor recibe los mensajes.

Cómo entregar la práctica

Entrar en la carpeta “equipoXX” y crear una carpeta que se llame practica2. En su interior existirán al menos estos ficheros:

Los ficheros deben ser añadidos al repositorio y enviados a Bitbucket. La forma de comprobar la práctica serán con los datos descargados desde Bitbucket. Asegúrate que están en Bitbucket.

El fichero makefile tendrá objetivos: all, envia, envia_udp, recibe_udp y borrar.

Los objetivos crearan los programas con el mismo nombre. all creara todos los programas y borrar borrara los ejecutables compilados dejando el directorio limpio tal y como se descargo del repositorio. Muy importante: no borrar los fichero envia.c ni ningun .c . Los programas deberan compilar correctamente tras ser descargados del repositorio asegurese de probarlo en una descarga vacia para no depender de lo que haya en su ordenador.

Únicamente se tendrá en cuenta el código que esté disponible en Bitbucket. No se podrá entregar de ninguna otra manera.

Retos extra

Para los que acaben la práctica en la primera semana

Retos extra de la práctica 2