Você está na página 1de 35

Funciones de sockets en C

Prcticas 4 y 5
(versin 2012-2013)

Universidad de Valencia

Redes Sockets-1

Rogelio Montaana

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 conexin.
Garantiza la entrega sin prdidas, descarte de duplicados, etc.
UDP (User Datagram Protocol) : no orientado a conexin. 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 trfico de los
procesos a nivel de aplicacin mediante los nmeros de
puertos.
Universidad de Valencia

Redes Sockets-2

Rogelio Montaana

Especificacin del protocolo de transporte


32 bits
Versin

Lon. Cab.

DS (DiffServ)

Identificacin
Tiempo de vida (TTL)

Longitud Total
Res. DF MF

Protocolo

Desplazam. de Fragmento
Checksum

Direccin de origen
Direccin de destino
Opciones (de 0 a 40 octetos)

Universidad de Valencia

Valor

Protocolo

ICMP

IP

TCP

17

UDP

89

OSPF

Redes Sockets-3

Protocolos de transporte

Rogelio Montaana

Cabeceras UDP y TCP


32 bits
Cabecera
UDP

Puerto de origen

Puerto de destino

Longitud datagrama UDP

Checksum (opcional)

Puerto de origen

Puerto de destino

Nmero de secuencia
Nmero de acuse de recibo
Cabecera
TCP

L. Cab. Resv.
(4 bits) (4 bits)

Flags
(8 bits)

Checksum
Opciones
Flags:

Universidad de Valencia

Tamao ventana
Puntero datos urgentes
Relleno

7: SYN: indica el inicio de una conexin


8: FIN: indica el final de una conexin
Redes Sockets-4

Rogelio Montaana

Puertos y Servidores
Los puertos se identifican por un nmero 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 estn 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 operacin

Universidad de Valencia

Redes Sockets-5

Rogelio Montaana

Algunos servicios bien conocidos

Universidad de Valencia

Servicio

Puerto

TCP

UDP

DayTime

13

FTP

21

SSH

22

TelNet

23

SMTP

25

Domain (DNS)

53

BOOTP

67

HTTP

80

POP3

110

NTP

123

SNMP

161

HTTPS

443

Redes Sockets-6

X
X

Rogelio Montaana

Multiplexacin
Nivel de aplicacin
Mltiples instancias
(una o varias por
protocolo)

FTP

HTTP

(Puerto 21)

(Puerto 80)

Nivel de transporte
Dos instancias
(TCP y UDP)

HTTP
(Puerto 400)
Servicio no
estndar

Telnet

SMTP

(Puerto 23)

(Puerto 25)

Checksum

P. dest. (23)

DATOS APLICACIN

Cabecera TCP

Una instancia IP
(puede haber otros
protocolos)

Checksum

Nivel de red

Prot. (6)

SEGMENTO TCP

Cabecera IP

Nivel de enlace
Mltiples instancias
(una por interfaz)

Ethertype (0800)

DATAGRAMA IP

CRC

Cabecera MAC Ethernet


Universidad de Valencia

Redes Sockets-7

Rogelio Montaana

Puertos de Clientes
A diferencia de los servidores, los clientes usan
nmeros 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 efmeros ya que, a diferencia de
puertos de servidores, suelen tener una vida muy corta
(la de la conexin)
La mayora de los sistemas operativos no utilizan para
los puertos efmeros todo el rango posible (102465535) sino slo una parte

Universidad de Valencia

Redes Sockets-8

Rogelio Montaana

Sockets
La combinacin de una direccin IP y un nmero de
puerto identifica un punto de conexin del nivel de
transporte. Es lo que llamamos un socket
Ejemplo de socket: 10.0.1.25 : 80
Direccin IP

Puerto

Socket

Podemos considerar el socket como la direccin


completamente especificada:

Av. Blasco Ibez 78 5 puerta


Direccin IP

Puerto
Socket

Universidad de Valencia

Redes Sockets-9

Rogelio Montaana

Comunicacin entre dos sockets


Socket 10.0.1.25.80
(rojo = LISTEN)

Socket: 10.0.2.47.1038

Conexin TCP
10.0.1.25.80-10.0.2.47.1038

Puerto
80

Puerto
1038

El ordenador ejecuta
el programa Explorer

IP 10.0.1.25
IP 10.0.2.47
Servidor Web

Cliente

Conexin de un cliente a un servidor web

Universidad de Valencia

Redes Sockets-10

Rogelio Montaana

Prctica 4: Programa cliente TCP


Se trata de hacer un programa que establezca
una conexin al puerto 13 (servicio daytime) de
un servidor. La direccin IP se especificar en
tiempo de ejecucin.
Cuando la conexin se establece el servidor
devuelve una cadena de caracteres que
contiene la fecha y hora, y cierra la conexin
El cliente debe leer la cadena recibida y
mostrarla por pantalla

Universidad de Valencia

Redes Sockets-11

Rogelio Montaana

Conexin TCP al puerto 13 (daytime)


TCP Servidor
(daytime, puerto 13)

TCP Cliente
Funcin

CLOSED

LISTEN

SYN-SENT
Conexin

ESTABLISHED
ESTABLISHED
connect

(fecha-hora)

Tiempo

SYN-RECEIVED

Intercambio
de datos

FIN-WAIT-1
CLOSE-WAIT

LAST-ACK
TIME-WAIT
..
..
.
LISTEN

close
CLOSED

Universidad de Valencia

Redes Sockets-12

Desconexin
2- 4
min.

Rogelio Montaana

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. Tambin nos
muestra si tenemos algn 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 envan, etc.
Universidad de Valencia

Redes Sockets-13

Rogelio Montaana

Comando netstat en un host


C:\>netstat -n
Conexiones activas
Proto
TCP
TCP
TCP
TCP
TCP
TCP
C:\>

Puerto local

IP remota

Direccin local

Direccin remota

Estado

10.0.1.25:3719
10.0.1.25:4111
10.0.1.25:4113
10.0.1.25:80
10.0.1.25:80
10.0.1.25:80

10.0.1.60:21
10.0.1.50:110
10.0.1.50:110
10.0.1.40:1056
10.0.1.30:2312
*:*

ESTABLISHED
TIME_WAIT
TIME_WAIT
ESTABLISHED
ESTABLISHED
LISTEN

Puerto remoto

IP local

Servidor web a la escucha en este host


Conexin de clientes con el servidor web de este host
Sesin pendiente de cerrar de un cliente de correo de este host con 10.0.1.50
Conexin de un cliente ftp de este host con 10.0.1.60
Si no se utiliza la opcin 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)
Universidad de Valencia

Redes Sockets-14

Rogelio Montaana

Diferencia entre Protocolo e Interfaz


Protocolo: Reglas que rigen la comunicacin 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 comunicacin entre dos procesos en
capas consecutivas dentro del mismo sistema. Pueden no ser
estndar, pero su estandarizacin permite la portabilidad de
software entre sistemas de distinta arquitectura.
Normalmente la Interfaz se especifica y estandariza mediante una
API (Interfaz de Programacin de Aplicaciones) que es una librera
de funciones para la comunicacin entre procesos. En TCP/IP las
APIs ms utilizadas derivan de la librera Berkeley sockets escrita
en C, que apareci en el Unix BSD 4.2 en 1983. Esta API permite
utilizar desde el nivel de aplicacin los servicios del nivel de
transporte.
Universidad de Valencia

Redes Sockets-15

Rogelio Montaana

Protocolos e Interfaces
Interfaz

Protocolo
HTTP

A
Sockets BSD

Sockets BSD

TCP

T
IP

IP

IP

Cliente

Universidad de Valencia

Router

Redes Sockets-16

Router

Servidor
Rogelio Montaana

Porgrama cliente TCP (Daytime)


Tarea:

Valor entero que


identifica el socket

Indica
protocolo IP

Indica
protocolo TCP

1: Creamos el socket

n = socket ( PF_INET , SOCK_STREAM , 0)


(no se enva nada)
Dir. IP y puerto
a conectar

2: Conectamos con el servidor


connect ( n , (struct sockaddr *)&s ,sizeof(struct sockaddr_in))
(se intercambian 6 paquetes)
Variable donde
se recogen los
datos recibidos

El servidor acepta la conexin,


devuelve la fecha/hora y cierra.

3: Leemos los datos recibidos


(no se enva nada)
4: Cerramos el socket

read ( n , buffer ,TAM_BUFFER)

close ( n )

(se intercambian 2 paquetes)


Universidad de Valencia

Redes Sockets-17

Rogelio Montaana

Estructura sockaddr_in

Campos:

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

La direccin IP se guarda
en un entero largo (32 bits)
en todas las arquitecturas

Ejemplo
de uso:

struct sockaddr_in s;
...
Funciones de conversin
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");

El nmero de puerto se guarda


en un entero corto (16 bits)

Uso TCP:

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

Uso UDP:

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

Universidad de Valencia

Redes Sockets-18

Rogelio Montaana

Comentarios al programa cliente TCP

El entero que devuelve la funcin socket no tiene nada que ver con el
nmero 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 conexin ni transmite ningn paquete, solo
prepara el socket local para la conexin
connect establece la conexin TCP. Para ello ha de indicar la direccin IP
y puerto, es decir el socket remoto con el que queremos conectar.
Si connect no da error podemos estar seguros de que la conexin 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 (efmero) 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 envo del FIN por parte del cliente y la confirmacin del
servidor. Cierra la conexin liberando los recursos reservados en socket.
Si en el mismo programa quisiramos hacer una segunda conexin
deberamos llamar a socket de nuevo

Universidad de Valencia

Redes Sockets-19

Rogelio Montaana

Prctica 4: Programa cliente UDP


El cliente enva un datagrama UDP al puerto 13
del servidor. A continuacin 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

Universidad de Valencia

Redes Sockets-20

Rogelio Montaana

Intercambio de paquetes UDP al puerto 13


UDP Servidor
(daytime, puerto 13)

UDP Cliente

Tiempo

LISTEN

Universidad de Valencia

(fecha-hora)

Redes Sockets-21

Rogelio Montaana

Porgrama cliente UDP (Daytime)


Tarea:

1: Crear el socket
2: Enviar
datagrama
vaco

Valor entero que


identifica el socket

Indica
protocolo IP

n = socket ( PF_INET , SOCK_DGRAM , 0)


Datagrama
vaco

Dir. IP y puerto
de destino

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


sizeof(struct sockaddr_in)
Conjunto de
sockets de lectura

3: Esperar respuesta

5: Cerrar el socket
Universidad de Valencia

Tiempo de espera

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


Variable donde
se recogen los
datos recibidos

4: Leer la
respuesta

Indica
protocolo UDP

El servidor recibe el datagrama


y devuelve la fecha/hora.

recv( n , buffer , TAM_BUFFER,0)

close ( n )
Redes Sockets-22

Rogelio Montaana

Comentarios al programa cliente UDP

socket prepara el socket local, pero no manda ningn paquete ni especifica


el socket remoto (direccin IP y puerto)
sendto enva el datagrama UDP. En ella indicamos la dir. IP y puerto de
destino, es decir el socket al que queremos enviar el paquete
En ningn momento indicamos nuestro socket (el del cliente) en el programa.
La IP es la nuestra y el puerto (efmero) lo elige el sistema operativo
La correcta ejecucin de sendto no demuestra que el paquete haya llegado
a su destino, solo que ha salido. Podra no existir la IP de destino, o estar
cerrado el puerto 13 en ese host y sendto terminara sin error
Con select nos ponemos a esperar la respuesta. El valor que devuelve
select puede ser:
Negativo, es que se ha producido algn 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

Universidad de Valencia

Redes Sockets-23

Rogelio Montaana

Estructura timeout (en select)


Campos:

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

Ejemplo
de uso:

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

Uso en la select:

Universidad de Valencia

Timeout 1 segundo

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

Redes Sockets-24

Rogelio Montaana

Arquitecturas
big-endian y little-endian
Los procesadores big-endian representan los enteros
colocando primero el byte ms significativo. Los
procesadores little-endian lo hacen al revs. Ejemplo:
Un short int (16 bits) con valor 13 en big-endian es 0x000D
Un 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

Universidad de Valencia

Redes Sockets-25

Rogelio Montaana

Funciones de conversin de enteros


En la estructura sockaddr_in se manejan dos tipos de enteros:
Cortos (16 bits) para los nmeros de puerto.
Largos (32 bits) para las direcciones IP.
Las funciones htons y ntohs (htonl/htons) realizan la conversin
host->red o red->host en cada caso
Los nmeros de puerto, cuando se imprimen o muestran por
pantalla se representan como un entero de 16 bits, por lo que no es
necesaria ninguna conversin 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

Universidad de Valencia

Redes Sockets-26

Rogelio Montaana

Funciones de conversin

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) )

Universidad de Valencia

Redes Sockets-27

Rogelio Montaana

Programa servidor TCP


Se trata de hacer un servidor del protocolo IRC (Internet
Relay Chat). Cuando un cliente enva 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 ejecucin
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 aade un elemento a la
lista
Cuando un cliente se desconecta quita su elemento y compacta
el resto de la lista

Universidad de Valencia

Redes Sockets-28

Rogelio Montaana

Programa servidor TCP:


inicializacin
Tarea:
1: Crear el socket

n = socket ( PF_INET , SOCK_STREAM , 0)


INADDR_ANY y puerto

2: Asociarle un puerto

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

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 deberamos
ver el puerto correspondiente en modo LISTEN con el netstat
Universidad de Valencia

Redes Sockets-29

Rogelio Montaana

Comentarios a la inicializacin del


programa servidor TCP
socket solo prepara las cosas reservando los recursos, como
siempre.
bind asocia un determinado nmero de puerto con ese
socket, y una direccin IP. El puerto es el que hemos elegido
para proveer el servicio, y como no queremos restringirlo a
una IP concreta ponemos como direccin 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 tambin ha de hacer otras cosas

Universidad de Valencia

Redes Sockets-30

Rogelio Montaana

Programa servidor TCP:


conexin y lectura de un cliente
Tarea:
4: Esperar conex. nuevas

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


IP y puerto
del cliente

Socket creado
para el cliente

ncon(i) = accept ( n , (struct sockaddr *)&s , &cod )

5: Aceptar una conexin


6: Preparar para leer
7: Leer (hay que
buscar el socket que nos
ha mandado datos,
la select no nos lo dice)
Macro para averiguar si
un socket se ha visto
afectado por la select
Universidad de Valencia

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

i=0;
while (i<*num)
{
if ( FD_ISSET ( ncon[i] , &conjunto ))
cod=read(ncon[i],buffer[cont],TAM_TEXTO)
}
i++;

Redes Sockets-31

Rogelio Montaana

Macros FD utilizadas en select


FD_ZERO
FD_SET
FD_CLR
FD_ISSET

Inicializa el conjunto
Aade un socket al conjunto
Borra un socket del conjunto
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);
}

Universidad de Valencia

Redes Sockets-32

Rogelio Montaana

Tarea:

Programa servidor TCP:


escritura en los clientes
Conjunto de sockets
de escritura

8: Preparar para escribir

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

9: Escribir (en
todos los clientes)

i=0;

10: Cerrar la conexin


de un cliente
Universidad de Valencia

while (i<*num)
{
if (FD_ISSET(ncon[i],&conjunto))
cod= write ( ncon[i] , buffer ,strlen)
}
i++;

close ( ncon[i] )

Redes Sockets-33

Rogelio Montaana

Programa servidor TCP:


Cierre de la conexin de un cliente
Cuando leemos datos de un cliente con la funcin read el
valor devuelto indica el nmero de bytes ledos. Si
devuelve 0 significa que el cliente ha cerrado la conexin:

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


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

Universidad de Valencia

Redes Sockets-34

Rogelio Montaana

Ejecucin del Programa servidor TCP


Durante su ejecucin el programa servidor est en un bucle sin fin que
llama consecutivamente a dos funciones:
AceptarConexion
Leer

La salida de cada funcin se produce bien, porque se ha hecho la tarea


prevista (aceptar conexin 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 pequeo, por ejemplo un microsegundo?

Universidad de Valencia

Redes Sockets-35

Rogelio Montaana

Você também pode gostar