Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y...

35
Redes Sockets-1 niversidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Transcript of Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y...

Page 1: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-1Universidad de Valencia Rogelio Montañana

Funciones de sockets en C

Prácticas 4 y 5

(versión 2012-2013)

Page 2: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-2Universidad de Valencia Rogelio Montañana

Protocolos de transporte de Internet

• Se encargan del transporte de los datos extremo a extremo (host a host).

• Hay dos protocolos para dos tipos de servicio:– TCP (Transmission Control Protocol): orientado a conexión.

Garantiza la entrega sin pérdidas, descarte de duplicados, etc.– UDP (User Datagram Protocol) : no orientado a conexión. No

garantiza la entrega, equivale en el nivel de transporte al servicio que ofrece IP en el nivel de red.

• En un host hay una sola instancia de TCP y una de UDP, que dan servicio a todas las aplicaciones que lo soliciten

• TCP y UDP se encargan de multiplexar el tráfico de los procesos a nivel de aplicación mediante los números de puertos.

Page 3: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-3Universidad de Valencia Rogelio Montañana

32 bits

Especificación del protocolo de transporte

Versión Lon. Cab. DS (DiffServ) Longitud Total

Identificación Res. DF MF Desplazam. de Fragmento

Tiempo de vida (TTL) Protocolo Checksum

Dirección de origen

Dirección de destino

Opciones (de 0 a 40 octetos)

Valor Protocolo

1 ICMP

4 IP

6 TCP

17 UDP

89 OSPF

Protocolos de transporte

Page 4: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-4Universidad de Valencia Rogelio Montañana

Relleno

Flags(8 bits)

Resv.(4 bits)

Puntero datos urgentes

Tamaño ventana

Puerto de destino

Opciones

Checksum

L. Cab.

(4 bits)

Número de acuse de recibo

Número de secuencia

Puerto de origen

Flags: 7º: SYN: indica el inicio de una conexión8º: FIN: indica el final de una conexión

32 bits

Puerto de origen Puerto de destino

Longitud datagrama UDP Checksum (opcional)

Cabeceras UDP y TCP

CabeceraUDP

CabeceraTCP

Page 5: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-5Universidad de Valencia Rogelio Montañana

Puertos y Servidores• Los puertos se identifican por un número entero de 16

bits (rango de 0 a 65535)• Cada paquete lleva un puerto de origen y uno de destino

(como las direcciones IP)• Los puertos 0 a 1023 están reservados para los

servicios ‘bien conocidos’, por ejemplo:

puerto 80 → servicio web (HTTP)

de esta forma los clientes web (o lo que sea) saben a que puerto han de dirigir sus peticiones

• Algunas aplicaciones usan TCP, otras UDP. Algunas usan ambos, dependiendo del tipo de operación

Page 6: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-6Universidad de Valencia Rogelio Montañana

Algunos servicios ‘bien conocidos’Servicio Puert

oTCP UDP

DayTime 13 X X

FTP 21 X

SSH 22 X

TelNet 23 X

SMTP 25 X

Domain (DNS)

53 X X

BOOTP 67 X

HTTP 80 X

POP3 110 X

NTP 123 X

SNMP 161 X

HTTPS 443 X

Page 7: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-7Universidad de Valencia Rogelio Montañana

Nivel de enlace

Nivel de red

Nivel de transporte

Nivel de aplicación

Ethertype (0800) DATAGRAMA IP CRC

Prot. (6) SEGMENTO TCP

P. dest. (23) DATOS APLICACIÓN

SMTP(Puerto 25)

Telnet(Puerto 23)

FTP(Puerto 21)

Cabecera MAC Ethernet

Cabecera IP

Cabecera TCP

Multiplexación

Checksum

Checksum

HTTP(Puerto 80)

HTTP(Puerto 400)Servicio no

estándar

Múltiples instancias (una por interfaz)

Dos instancias(TCP y UDP)

Múltiples instancias (una o varias por

protocolo)

Una instancia IP (puede haber otros

protocolos)

Page 8: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-8Universidad de Valencia Rogelio Montañana

Puertos de Clientes

• A diferencia de los servidores, los clientes usan números de puerto elegidos arbitrariamente por el sistema operativo, pero siempre con valores superiores al 1023, para no coincidir con los servidores que pueda haber en ese host

• A los puertos elegidos por los clientes se les suele llamar puertos ‘efímeros’ ya que, a diferencia de puertos de servidores, suelen tener una vida muy corta (la de la conexión)

• La mayoría de los sistemas operativos no utilizan para los puertos efímeros todo el rango posible (1024-65535) sino sólo una parte

Page 9: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-9Universidad de Valencia Rogelio Montañana

Sockets

• La combinación de una dirección IP y un número de puerto identifica un punto de conexión del nivel de transporte. Es lo que llamamos un ‘socket’Ejemplo de socket: 10.0.1.25 : 80

• Podemos considerar el socket como la dirección completamente especificada:

Av. Blasco Ibáñez 78 – 5ª puerta

Dirección IP Puerto

Socket

Dirección IP Puerto

Socket

Page 10: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-10Universidad de Valencia Rogelio Montañana

Conexión TCP10.0.1.25.80-10.0.2.47.1038 Puerto

1038El ordenador ejecuta

el programa ‘Explorer’

Socket: 10.0.2.47.1038

Conexión de un cliente a un servidor web

IP 10.0.2.47

IP 10.0.1.25

Puerto 80

Socket 10.0.1.25.80

(rojo = ‘LISTEN’)

Servidor Web

Comunicación entre dos sockets

Cliente

Page 11: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-11Universidad de Valencia Rogelio Montañana

Práctica 4: Programa cliente TCP

• Se trata de hacer un programa que establezca una conexión al puerto 13 (servicio daytime) de un servidor. La dirección IP se especificará en tiempo de ejecución.

• Cuando la conexión se establece el servidor devuelve una cadena de caracteres que contiene la fecha y hora, y cierra la conexión

• El cliente debe leer la cadena recibida y mostrarla por pantalla

Page 12: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-12Universidad de Valencia Rogelio Montañana

TCP ClienteTCP Servidor

(daytime, puerto 13)

T

iem

po

Quiero conectar contigo (SYN)

Vale, acepto la invitación (SYN)

¡Ya estamos conectados!

Conexión TCP al puerto 13 (daytime)

CLOSED

SYN-SENT

LISTEN

SYN-RECEIVED

ESTABLISHED

ESTABLISHED

Mando datos: bytes 1-26

Bytes 1-26 recibidos OK

Quiero desconectar (FIN)

Vale, de acuerdo (FIN)

¡Adiós!

CLOSE-WAIT

LAST-ACK

CLOSED

FIN-WAIT-1

TIME-WAIT

LISTEN

2- 4min.

Conexión

Desconexión

Intercambio de datos

(fecha-hora)

....

.

connect

close

Función

Page 13: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-13Universidad de Valencia Rogelio Montañana

Como ver las conexiones TCP

• Comando netstat: nos permite ver que conexiones TCP que tenemos activas en un momento dado (socket origen – socket destino) y el estado en que se encuentran. También nos muestra si tenemos algún puerto a la escucha (modo LISTEN)

• Programa wireshark: nos permite capturar los paquetes enviados y recibidos, pudiendo analizar su contenido con todo detalle, el momento en que se envían, etc.

Page 14: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-14Universidad de Valencia Rogelio Montañana

Comando ‘netstat’ en un hostC:\>netstat -nConexiones activas

Proto Dirección local Dirección remota Estado TCP 10.0.1.25:3719 10.0.1.60:21 ESTABLISHED TCP 10.0.1.25:4111 10.0.1.50:110 TIME_WAIT TCP 10.0.1.25:4113 10.0.1.50:110 TIME_WAIT TCP 10.0.1.25:80 10.0.1.40:1056 ESTABLISHED TCP 10.0.1.25:80 10.0.1.30:2312 ESTABLISHED TCP 10.0.1.25:80 *:* LISTENC:\>

IP local

IP remotaPuerto local

Puerto remoto

Servidor web a la escucha en este hostConexión de clientes con el servidor web de este hostSesión pendiente de cerrar de un cliente de correo de este host con 10.0.1.50Conexión de un cliente ftp de este host con 10.0.1.60

Si no se utiliza la opción ‘–n’ el programa netstat intenta convertir las direcciones IP y los puertos a nombres siempre que puede (por ejemplo pone ‘pop3’ en vez de 110)

Page 15: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-15Universidad de Valencia Rogelio Montañana

Diferencia entre Protocolo e Interfaz• Protocolo: Reglas que rigen la comunicación entre dos procesos

que se ejecutan en dos sistemas diferentes en la misma capa del modelo OSI. Para asegurar su interoperabilidad es necesario estandarizarlos. Ejemplos de protocolos: IPv4 (RFC 791), TCP (RFC 793), HTTP (RFC 2616)

• Interfaz: Reglas que rigen la comunicación entre dos procesos en capas consecutivas dentro del mismo sistema. Pueden no ser estándar, pero su estandarización permite la portabilidad de software entre sistemas de distinta arquitectura.

• Normalmente la Interfaz se especifica y estandariza mediante una API (Interfaz de Programación de Aplicaciones) que es una librería de funciones para la comunicación entre procesos. En TCP/IP las APIs más utilizadas derivan de la librería “Berkeley sockets” escrita en C, que apareció en el Unix BSD 4.2 en 1983. Esta API permite utilizar desde el nivel de aplicación los servicios del nivel de transporte.

Page 16: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-16Universidad de Valencia Rogelio Montañana

A

Protocolos e Interfaces

HTTP

TCP

IP

Cliente Servidor

T

E

RIP IP

F

A

T

E

R

F

E

R

F

E

R

F

RouterRouter

Sockets BSD Sockets BSD

Protocolo Interfaz

Page 17: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-17Universidad de Valencia Rogelio Montañana

Porgrama cliente TCP (Daytime)

1: Creamos el socket

(no se envía nada)

2: Conectamos con el servidor

(se intercambian 6 paquetes)

3: Leemos los datos recibidos

(no se envía nada)

4: Cerramos el socket

(se intercambian 2 paquetes)

n = socket ( PF_INET , SOCK_STREAM , 0)

connect ( n , (struct sockaddr *)&s ,sizeof(struct sockaddr_in))

read ( n , buffer ,TAM_BUFFER)

close ( n )

Indicaprotocolo IP

Indicaprotocolo TCP

Valor entero queidentifica el socket

Dir. IP y puertoa conectar

El servidor acepta la conexión, devuelve la fecha/hora y cierra.

Tarea:

Variable donde se recogen los datos recibidos

Page 18: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-18Universidad de Valencia Rogelio Montañana

Estructura sockaddr_instruct in_addr{unsigned long int s_addr;};struct sockaddr_in{int sin_family;unsigned short int sin_port;struct in_addr sin_addr;};

connect( n , (struct sockaddr *)&s ,sizeof(struct sockaddr_in))

sendto ( n , NULL ,0,0, (struct sockaddr *)&s , sizeof(struct sockaddr_in)

struct sockaddr_in s;...s.sin_family=PF_INET;s.sin_port= htons (13);if ( inet_aton (“147.156.13.25”,&s.sin_addr)==0) error(sock,"inet_aton");

Campos:

Ejemplo de uso:

Uso TCP:

Uso UDP:

El número de puerto se guarda en un entero corto (16 bits)

La dirección IP se guarda en un entero largo (32 bits)en todas las arquitecturas

Funciones de conversión

Page 19: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-19Universidad de Valencia Rogelio Montañana

Comentarios al programa cliente TCP• El entero que devuelve la función socket no tiene nada que ver con el

número de puerto del cliente y del servidor. Es un identificador de ese socket elegido por el sistema de ficheros (normalmente el 3).

• socket no establece ninguna conexión ni transmite ningún paquete, solo prepara el socket local para la conexión

• connect establece la conexión TCP. Para ello ha de indicar la dirección IP y puerto, es decir el socket remoto con el que queremos conectar.

• Si connect no da error podemos estar seguros de que la conexión ha funcionado.

• El programa elige el socket remoto (IP y pueto) pero no el local. La IP es la de la interfaz y el puerto (efímero) lo elige el sistema operativo.

• connect provoca el intercambio de 6 paquetes (de SYN a FIN). • read no transmite nada, su efecto es puramente local.• close provoca el envío del FIN por parte del cliente y la confirmación del

servidor. Cierra la conexión liberando los recursos reservados en socket. Si en el mismo programa quisiéramos hacer una segunda conexión deberíamos llamar a socket de nuevo

Page 20: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-20Universidad de Valencia Rogelio Montañana

Práctica 4: Programa cliente UDP

• El cliente envía un datagrama UDP al puerto 13 del servidor. A continuación se queda bloqueado durante un tiempo (por defecto un segundo) a la espera de la respuesta

• Si antes de agotar el tiempo se recibe la respuesta el programa muestra por pantalla el contenido (la fecha y la hora) y termina

• Si no se recibe respuesta dentro del tiempo previsto el programa indica ‘timeout’ y termina

Page 21: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-21Universidad de Valencia Rogelio Montañana

UDP ClienteUDP Servidor

(daytime, puerto 13)

T

iem

po

Datagrama vacío

Intercambio de paquetes UDP al puerto 13

LISTEN

Mando datos (fecha-hora)

Page 22: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-22Universidad de Valencia Rogelio Montañana

recv( n , buffer , TAM_BUFFER,0)

sendto ( n , NULL ,0,0, (struct sockaddr *)&s , sizeof(struct sockaddr_in)

Porgrama cliente UDP (Daytime)

1: Crear el socket

2: Enviar datagrama vacío

3: Esperar respuesta

5: Cerrar el socket

n = socket ( PF_INET , SOCK_DGRAM , 0)

close ( n )

Indicaprotocolo IP

Indicaprotocolo UDP

Valor entero queidentifica el socket

Dir. IP y puertode destino

El servidor recibe el datagrama y devuelve la fecha/hora.

Tarea:

Variable donde se recogen los datos recibidos

Datagrama vacío

select( n +1, &conjunto ,NULL,NULL, &timeout )

Conjunto de sockets de lectura Tiempo de espera

4: Leer la respuesta

Page 23: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-23Universidad de Valencia Rogelio Montañana

Comentarios al programa cliente UDP• socket prepara el socket local, pero no manda ningún paquete ni especifica

el socket remoto (dirección IP y puerto)• sendto envía el datagrama UDP. En ella indicamos la dir. IP y puerto de

destino, es decir el socket al que queremos enviar el paquete• En ningún momento indicamos nuestro socket (el del cliente) en el programa.

La IP es la nuestra y el puerto (efímero) lo elige el sistema operativo• La correcta ejecución de sendto no demuestra que el paquete haya llegado

a su destino, solo que ha salido. Podría no existir la IP de destino, o estar cerrado el puerto 13 en ese host y sendto terminaría sin error

• Con select nos ponemos a esperar la respuesta. El valor que devuelve select puede ser:– Negativo, es que se ha producido algún error– Cero, es que se ha agotado el tiempo sin recibir respuesta– Positivo, es que se ha recibido alguna respuesta. En ese caso para leerla

debemos utilizar recv

Page 24: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-24Universidad de Valencia Rogelio Montañana

Estructura timeout (en select)

struct timeval{unsigned long int tv_sec; /* Segundos */unsigned long int tv_usec; /* Millonesimas de segundo */};

timeout.tv_sec=1;timeout.tv_usec=0;

Campos:

Ejemplo de uso:

select ( n +1, &conjunto ,NULL,NULL, &timeout )Uso en la select:

Timeout 1 segundo

Page 25: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-25Universidad de Valencia Rogelio Montañana

Arquitecturas big-endian y little-endian

• Los procesadores big-endian representan los enteros colocando primero el byte más significativo. Los procesadores little-endian lo hacen al revés. Ejemplo:Un ’short int’ (16 bits) con valor 13 en big-endian es 0x000DUn ’short int’ con el valor 13 en little-endian es 0x0D00

• Internet utiliza siempre formato big-endian• Las funciones htons, htonl, ntohs y ntohl se encargan de

convertir los datos en caso necesario. De este modo los programas son independientes de la arquitectura utilizada

• En un sistema big-endian estas funciones no hacen nada, pero debemos usarlas siempre para que los programas funcionen en todos los casos de forma transparente

Page 26: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-26Universidad de Valencia Rogelio Montañana

Funciones de conversión de enteros• En la estructura sockaddr_in se manejan dos tipos de enteros:

– Cortos (16 bits) para los números de puerto. – Largos (32 bits) para las direcciones IP.

• Las funciones htons y ntohs (htonl/htons) realizan la conversión host->red o red->host en cada caso

• Los números de puerto, cuando se imprimen o muestran por pantalla se representan como un entero de 16 bits, por lo que no es necesaria ninguna conversión adicional.

• Sin embargo las direcciones IP se suelen representar como cuatro enteros de 8 bits separados por puntos. Las funciones inet_aton e inet_ntoa se encargan de las conversiones necesarias. Ejemplo:

printf (“Dir. IP: %s %d\n” inet_ntoa (2476477461) )genera:

Dir. IP: 147.156.12.21

Page 27: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-27Universidad de Valencia Rogelio Montañana

Funciones de conversión

Nombre largo Nombre corto Ejemplo

host to network short htons s.sin_port= htons (13);

network to host short ntohs printf (“Puerto: %hu, %d\n” ntohs (s.sin_port) )

host to network long htonl s.sin_addr.s_addr = htonl (INADDR_ANY)

network to host long ntohl host = ntohl (direccion)

internet ASCII to network inet_aton inet_aton (“147.156.12.21”,&s.sin_addr)

internet network to ASCII inet_ntoa printf (“Dir. IP: %s %d\n” inet_ntoa (s.sin_addr) )

Page 28: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-28Universidad de Valencia Rogelio Montañana

Programa servidor TCP• Se trata de hacer un servidor del protocolo IRC (Internet

Relay Chat). Cuando un cliente envía un mensaje de texto el servidor lo difunde a todos los clientes conectados en ese momento

• El puerto utilizado para ofrecer el servicio se elegirá en tiempo de ejecución

• Cuando un cliente se conecta se le asigna un socket (valor entero elegido por el sistema) que le identifica. Los valores de los sockets no tienen por que ser correlativos ni crecientes

• Para llevar control de los clientes conectados el programa guarda en una lista o vector los sockets asignados:– Cuando se conecta un nuevo cliente añade un elemento a la

lista– Cuando un cliente se desconecta quita su elemento y compacta

el resto de la lista

Page 29: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-29Universidad de Valencia Rogelio Montañana

n = socket ( PF_INET , SOCK_STREAM , 0)

INADDR_ANY y puerto

Programa servidor TCP: inicialización

bind( n , (struct sockaddr *)&s , sizeof(struct sockaddr_in)2: Asociarle un puerto

1: Crear el socket

Tarea:

3: Ponerlo en modo ‘listen’ listen( n ,5)

4: Esperar conex. nuevas select ( n + 1 , &conjunto , NULL , NULL , &timeout )

Conjunto de sockets de lectura

Una vez ejecutada la select, si todo ha ido bien ya deberíamos ver el puerto correspondiente en modo LISTEN con el netstat

Page 30: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-30Universidad de Valencia Rogelio Montañana

Comentarios a la inicialización del programa servidor TCP

• socket solo prepara las cosas reservando los recursos, como siempre.

• bind asocia un determinado número de puerto con ese socket, y una dirección IP. El puerto es el que hemos elegido para proveer el servicio, y como no queremos restringirlo a una IP concreta ponemos como dirección INADDR_ANY. De esta manera aceptamos cualquier IP.

• listen pone el puerto indicado en bind en modo LISTEN.• select deja el programa a la espera de nuevas conexiones,

pero solo hasta agotar el tiempo marcado en &timeout. El programa no puede quedarse eternamente esperando nuevas conexiones, pues también ha de hacer otras cosas

Page 31: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-31Universidad de Valencia Rogelio Montañana

Programa servidor TCP:conexión y lectura de un cliente

Tarea:

4: Esperar conex. nuevas select ( n + 1 , &conjunto , NULL , NULL , &timeout )

5: Aceptar una conexión ncon(i) = accept ( n , (struct sockaddr *)&s , &cod )

select ( maxncon +1, &conjunto , NULL , NULL , &timeout )6: Preparar para leer

i=0; while (i<*num)

{ if ( FD_ISSET ( ncon[i] , &conjunto ))

cod=read(ncon[i],buffer[cont],TAM_TEXTO)}i++;

7: Leer (hay que buscar el socket que nos ha mandado datos, la select no nos lo dice)

Socket creado para el cliente

IP y puerto del cliente

Macro para averiguar si un socket se ha visto afectado por la select

Page 32: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-32Universidad de Valencia Rogelio Montañana

Macros FD utilizadas en ‘select’

FD_ZERO Inicializa el conjuntoFD_SET Añade un socket al conjuntoFD_CLR Borra un socket del conjuntoFD_ISSET Comprueba si un socket ha sido afectado por la select

fd_set conjunto; struct timeval t;

FD_ZERO(&conjunto); for(i=0;i<num;i++) {

FD_SET(ncon[i],&conjunto); }

Page 33: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-33Universidad de Valencia Rogelio Montañana

Programa servidor TCP:escritura en los clientesTarea:

8: Preparar para escribir

9: Escribir (en todos los clientes)

10: Cerrar la conexión de un cliente

select ( maxncon + 1 , NULL , &conjunto , NULL, &timeout )

i=0; while (i<*num)

{ if (FD_ISSET(ncon[i],&conjunto))

cod= write ( ncon[i] , buffer ,strlen)}i++;

close ( ncon[i] )

Conjunto de sockets de escritura

Page 34: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-34Universidad de Valencia Rogelio Montañana

Programa servidor TCP:Cierre de la conexión de un cliente

Cuando leemos datos de un cliente con la función read el valor devuelto indica el número de bytes leídos. Si

devuelve 0 significa que el cliente ha cerrado la conexión:

nbytes = read ( ncon[i] ,buffer ,TAM_TEXTO );

if (cod==0) close ( ncon[i] );

Page 35: Redes Sockets-1 Universidad de Valencia Rogelio Montañana Funciones de sockets en C Prácticas 4 y 5 (versión 2012-2013)

Redes Sockets-35Universidad de Valencia Rogelio Montañana

Ejecución del Programa servidor TCP

Durante su ejecución el programa servidor está en un bucle sin fin que llama consecutivamente a dos funciones:

• AceptarConexion• Leer

La salida de cada función se produce bien, porque se ha hecho la tarea prevista (aceptar conexión o leer) o porque se ha agotado el timeout de la select.

¿Qué ocurre si en la select ponemos un timeout grande, por ejemplo de 10 segundos?

¿Y si ponemos uno muy pequeño, por ejemplo un microsegundo?