Sunteți pe pagina 1din 22

DesarrollodeaplicacionesMulticast

SocketsenIPv6
Sockets
en IPv6
SocketsMulticast
Th d (hilos)
Threads
(hil )

08/05/2014

SocketsenIPv6:estructuras

Estructuradedireccionesdesockets enIPv6(definidasen<netinet/in.h>)
/*IPv6address */
struct in6_addr{
union {
uint8 t u6_addr8[16];
uint8_t
u6 addr8[16];
uint16_tu6_addr16[8];
uint32_tu6_addr32[4];
}
}in6_u;
_
};
struct sockaddr_in6{
uint8 t sin6 len;
uint8_tsin6_len;
/* Longitud de esta estructura*/
/*Longituddeestaestructura*/
sa_family_t sin6_family; /*AF_INET6*/
in_port_t sin6_port;
/*Transport layer port #*/
uint32_tsin6_flowinfo;
/*IPv6flow information */
struct in6_addrsin6_addr; /*IPv6address */
uint32_tsin6_scope_id;
/*IPv6scopeid*/
};

Redes de Computadores II - Grado en Ingeniera Informtica

SocketsenIPv6:crearyasociar
y
/*Declaracin*/
int s;
struct sockaddr_in6myaddr_in6;
/*Creacin*/
s=socket(AF_INET6,SOCK_STREAM,0);
/*Inicializacin*/
myaddr_in6.sin6_family=AF_INET6;
myaddr_in6.sin6_addr=in6addr_any;
dd i 6 i 6 dd
i 6 dd
myaddr_in6.sin6_port=htons(13);
/*Asociacin */
bind(s,(struct sockaddr *)&myaddr_in6,sizeof(myaddr_in6));

Redes de Computadores II - Grado en Ingeniera Informtica

SocketsenIPv6:cambiosdeformato
Cambiosdeformatoendirecciones(<arpa/inet.h>)
o int inet_p
pton(int
(
af,const
,
char *src,void
,
*dst);
);

ConviertedireccionesIPv4(AF_INET)eIPv6(AF_INET6)detextoaformatobinario
(estructuradedireccindered)
Reemplazaainet_aton
Reemplaza a inet aton yainet_addr
y a inet addr
o const char *inet_ntop(int af,const void *src,char *dst,socklen_t size);

ConviertedireccionesIPv4eIPv6deformatobinarioatexto
Reemplazaainet_ntoa
l

Ejemplo:
char equipo[INET6_ADDRSTRLEN];
equipo[INET6 ADDRSTRLEN];
unsigned char cliaddr[sizeof(struct in6_addr)];
inet_ntop (AF_INET6,cliaddr,equipo,sizeof(equipo));

EjemplodesocketsIPv6defechayhoradisponible
enDiaweb
Redes de Computadores II - Grado en Ingeniera Informtica

Otras familias y tipos de sockets (I)


Otrasfamiliasytiposdesockets(I)
Familia

Descripcin

AF_INET

Protocolos IPv4

AF_INET6

Protocolos IPv6

AF_LOCAL (AF_UNIX)

Protocolos de dominios de UNIX

AF_ROUTE

Sockets de encaminamiento

AF_KEY

Sockets de clave

AF_NS

Protocolos Xerox NS (XNS)

AF_ISO

Protocolos de OSI
Tipo

Descripcin

SOCK_STREAM

Sockets stream

SOCK_DGRAM

Sockets datagrama

SOCK_RAW

Procesado propio

SOCK PACKET
SOCK_PACKET

Acceso a nivel de enlace (slo para LINUX)

SOCK_SEQPACKET

Sockets de paquetes en secuencia

Redes de Computadores II - Grado en Ingeniera Informtica

Otras familias y tipos de sockets (y II)


Otrasfamiliasytiposdesockets(yII)
AF_INET

AF_INET6

AF_LOCAL

SOCK_STREAM

TCP

TCP

SI

SOCK_DGRAM

UDP

UDP

SI

SOCK_RAW

IPv4

IPv6

AF_ROUTE

AF_KEY

SI

SI

SOCK SEQPACKET
SOCK_SEQPACKET

Redes de Computadores II - Grado en Ingeniera Informtica

AF_OSI

AF_NS

SI

SI

Interoperatividad
p
IPv4eIPv6(I)
()
Basefundamental
o Sustituir
Sustituirllamadasagethostbyname
llamadas a gethostbyname ygethostbyaddr
y gethostbyaddr porgetaddrinfo
por getaddrinfo y
y
getnameinfo entreotras(<sys/types.h>,<sys/socket.h>y<netdb.h>)

Funcionesparagarantizarinteroperabilidad
o int getnameinfo (const struct sockaddr *sa,socklen_t salen,char *node,
socklen_t nodelen,char *serv,socklen_t servlen,unsigned int flags)
Resuelveelnombrededominiodadaladireccin
Combinalasfuncionalidadesdegethostbyaddr ygetservbyport

o int getaddrinfo(const char *nodename,const char *servname,const struct


addrinfo *hints,struct
,
addrinfo **res);
);
Resuelveladireccin(enunaoestructurasaddrinfo)dadosunombre
Combinalasfuncionalidadesdegethostbyname ygetservbyname

o void freeaddrinfo(struct addrinfo *ai);


ai);
Liberalamemoriaasociadaalaestructuraaddrinfo retornadaporgetaddrinfo

o const char *gai_strerror(int ecode);


Retornaelmensajeasociadoaloscdigosdeerrordevueltosporgetaddrinfo
R t
l
j
i d l
di
d
d
lt
t dd i f
Redes de Computadores II - Grado en Ingeniera Informtica

Escenario 1: Cliente IPv4, Servidor IPv6


Escenario1:ClienteIPv4,ServidorIPv6
Un
UnservidorIPv6conpiladualpuedeatenderclientesIPv4e
servidor IPv6 con pila dual puede atender clientes IPv4 e
IPv6
LohaceutilizandodireccionesIPv6obtenidasdela
Lo hace utilizando direcciones IPv6 obtenidas de la
correspondienteIPv4
ElservidorcreaunsocketIPv6queescuchaenladireccin
El
id
k t IP 6
h
l di
i
comodndeIPv6

Redes de Computadores II - Grado en Ingeniera Informtica

IPv6
client

IPv4
client

TCP

TCP

IPv6
server

IPv6 listening socket,


bound to ::,, p
port 8888

TCP
IPv6 address

IPv4 mapped
IPv6 address

IPv6

IPv4

IPv4

IPv6

206.62.226.42

Data
D
t
link

Data
D
t
link

Data
D
t
link

Enet
Type 0800 hdr

IPv4
hdr

TCP
hdr

5flb:df00:ce3
e:e200:20:80
0:2b37:6426

TCP
data

dport 8888

IPv6
Enet
hdr
hdr
Type 86dd

TCP
hdr

TCP
data

dport 8888

Servidor IPv6 atendiendo clientes IPv4 e IPv6

Redes de Computadores II - Grado en Ingeniera Informtica

IPv4
sockets
IPv6
sockets

AF_INET
AF_INET
SOCK_DGRAM
SOCK_STREAM
sockaddr in
sockaddr_in
sockaddr in
sockaddr_in
AF_INET6
AF_INET6
SOCK_STREAM
SOCK_DGRAM
sockaddr_in6
k dd i 6
sockaddr_in6
k dd i 6

UDP

TCP

IPv4 mapped
Address
returned by
y
accept or
recvfrom

P. ej.: IPv4 1.2.3.4


IPv6 correspondiente
::FFFF:102:304

IPv4

IPv6
IPv4

IP 4 ddatagram
IPv4

IP 6
IPv6
IPv6 datagram

Recepcin de datagramas, dependiendo del tipo de socket receptor


Redes de Computadores II - Grado en Ingeniera Informtica

10

Escenario 2: Cliente IPv6, Servidor IPv4


Escenario2:ClienteIPv6,ServidorIPv4
El
ElservidorIPv4seiniciaenunnodoqueslotieneIPv4y
servidor IPv4 se inicia en un nodo que slo tiene IPv4 y
creaunsocketsIPv4deescucha
ElclienteIPv6seiniciayantesdelconnect
El cliente IPv6 se inicia y antes del connect osendto
o sendto llamaa
llama a
getaddrinfo (antesgethostbyname)paraobtenerla
direccin IP del servidor La pila dual del cliente detecta la
direccinIPdelservidor.Lapiladualdelclientedetectala
direccinIPv4delservidoryretornaladireccinIPv6dela
correspondiente IPv4
correspondienteIPv4
Portanto,sehaceutilizandodatagramasIPv4

Redes de Computadores II - Grado en Ingeniera Informtica

11

IPv4
sockets
IPv6
sockets

AF_INET
AF_INET
SOCK_DGRAM
SOCK_STREAM
sockaddr in
sockaddr in
AF_INET6
AF_INET6
SOCK_STREAM
SOCK_DGRAM
sockaddr in6
sockaddr_in6
sockaddr in6
sockaddr_in6

UDP

TCP

IPv4 mapped

IPv6
Address
for connect
or sendto

IPv4

IPv6

IPv4

IPv4 datagram
g

IPv6
v
IPv6 datagram
g

Peticiones de clientes, dependiendo del tipo de direccin y tipo de socket


Redes de Computadores II - Grado en Ingeniera Informtica

12

Ejemplo
j p
ServidoryclientedefechayhoraTCPyUDPdisponibleenla
plataformadelaasignatura

Redes de Computadores II - Grado en Ingeniera Informtica

13

Aplicacionesmulticast
p
conSockets
Multicast
o Mediantelasfuncionessetsockopt ygetsockopt conlas
siguientesopciones
Orden

Tipodedato

Descripcin

IP_ADD_MEMBERSHIP
IPV6_ADD_MEMBERSHIP

struct ip_mreq
Unirse a un grupo multicast
struct ipv6_mreq

IP_DROP_MEMBERSHIP
IPV6_DROP_MEMBERSHIP

struct ip_mreq
Abandonar un grupo multicast
struct ipv6_mreq

IP_MULTICAST_IF
IPV6_MULTICAST_IF

struct in_addr

Especificar el interfaz por


defecto

IP_MULTICAST_TTL
IPV6_MULTICAST_HOPS

u char
u_char

Especificar el TTL en IPv4 y el


alcance para IPv6

IP_MULTICAST_LOOP
IPV6_MULTICAST_LOOP

u_char

Habilitar o deshabilitar
loopback

Redes de Computadores II - Grado en Ingeniera Informtica

14

Aplicacionesmulticast
p
conSockets(I)
()

Emisormulticast (Servidor)
Crear
CrearelsocketAF_INET(AF_INET6)ydel
el socket AF INET ( AF INET6) y del
tipoSOCK_DGRAM
Inicializarlaestructurasockaddr_in (
sockaddr_in6)connuestrapropiaIPy
_
p p
y
nmerodepuertoefmero
ActivarIP_MULTICAST_LOOP(
IPV6_MULTICAST_LOOP)enelsocketsise
d
desearecibirtambincopiadelos
ibi
bi
i d l
datagramasenviadosalgrupomulticast
Configurarsifueranecesariolainterfazpor
la que se enviarn los datagramas con la
laqueseenviarnlosdatagramasconla
opcinIP_MULTICAST_IF(
IPV6_MULTICAST_IF)
EnviareldatagramaalaIPmulticast
g
yy
nmerodepuertodenuestraaplicacin
(conocidopornuestrosclientes)rellenando
unaestructurasockaddr_in (
sockaddr in6)
sockaddr_in6)

Suscriptormulticast (Cliente)
Crear
CrearelsocketAF_INET(AF_INET6)y
el socket AF INET ( AF INET6) y
deltipoSOCK_DGRAM
ActivarlaopcinSO_REUSEADDRpara
permitirvariossuscriptoresenlamisma
p
p
mquina

Deestaformasepuedenrecibirdatagramas
destinadosalmismonumerodepuerto

Usar
Usarbind
bind paraespecificarelnmerode
para especificar el nmero de
puertodenuestraaplicacine
INADDR_ANY(in6addr_any)para
recibirdatagramas
UtilizarIP_ADD_MEMBERSHIP(
IPV6_ADD_MEMBERSHIP)para
especificarelgrupomulticast delquese
desean recibir datagramas y
deseanrecibirdatagramasy
opcionalmenteporquinterfazsiel
equipotienevarias(estructura
pv6_mreq)
p
_
q)
Recibirlosdatagramas

Redes de Computadores II - Grado en Ingeniera Informtica

15

Aplicacionesmulticast
p
conSockets(II)
( )

Extractodecdigodeuninalgrupomulticast enunadeterminadainterfaz
...
#defineGRUPOMULTICASTV6"ff15::33
#defineINTERFAZeth0
...
struct ipv6_mreqipv6mreq;
...
ipv6mreq.ipv6mr_interface=if_nametoindex(INTERFAZ);
/*Convierteladireccinmulticast abinario*/
if(inet_pton(familia,GRUPOMULTICASTV6,&ipv6mreq.ipv6mr_multiaddr)==1)
{
perror(Llamada inet pton\n");
perror(Llamadainet_pton\n");
exit(1);
}
/*Unirsealgrupomulticast
/*
U i
l
lti
t */
if(setsockopt(s,IPPROTO_IPV6,IPV6_ADD_MEMBERSHIP,&ipv6mreq,sizeof(ipv6mreq))==1)
{
perror(Llamadasetsockopt paramulticast\n");
exit(1);
}
Redes de Computadores II - Grado en Ingeniera Informtica

16

Aplicacionesmulticast
p
conSockets(yIII)
(y )

Extractodecdigoparaespecificarlainterfazporlaquedifundir
...
#defineINTERFAZeth0
...
int interfaz;
...
interfaz=if_nametoindex(INTERFAZ);
/*Difundirporunainterfazdeterminada*/
if(setsockopt(s,IPPROTO_IPV6,IPV6_MULTICAST_IF,(char *)&interfaz,sizeof(interfaz)))==1)
{
perror(Llamada setsockopt paraespecificarinterfazdedifusin");
perror(Llamadasetsockopt
para especificar interfa de dif sin");
exit(1);
}

Redes de Computadores II - Grado en Ingeniera Informtica

17

Funcionesdegestindeaplicacionesde
multidifusin mcast XXX
multidifusinmcast_XXX
Funcionesdeutilidadenaplicacionesmultidifusin(fuente
originaldellibroUnixNetworkProgramming)
o
o
o
o
o
o
o
o

int mcast_get_if (int sockfd)


int mcast_get_loop
mcast get loop (int sockfd)
int mcast_get_ttl (int sockfd)
int mcast_join (int sockfd,const SA*sa,socklen_t salen,const
char
h
*if
*ifname,u_int
i t ifindex)
ifi d )
int mcast_leave (int sockfd,const SA*sa,socklen_t salen)
int mcast_set_if (int sockfd,constchar*ifname,u_int ifindex)
Int mcast_set_loop (int sockfd,int onoff)
Int mcast_set_ttl (int sockfd,int val)

ProgramasfuentesdellibroUnixNetworkProgramming
P
f
t d l lib U i N t
kP
i
o Pulseparadescargardelsitioweboficialdellibro
o PulseparadescargardelrepositoriodeprcticasdelDIAWEB
P l
d
d l
it i d
ti d l DIAWEB
Redes de Computadores II - Grado en Ingeniera Informtica

18

Threads (I)
()
Problemasdefork
o Lamemoriasecopiadepadresahijos,todoslosdescriptoresse
duplican
o SenecesitanmecanismosdeIPCparapasarinformacinentre
padresehijosdespusdefork

Solucin=Threads (hilos)
o Todoslosthread deunprocesocompartenlamismamemoriaglobal
o Lacreacindeunthread puedeserentre10100vecesmsrpida
quelacreacindeunproceso
o ProblemaSincronizacin

Redes de Computadores II - Grado en Ingeniera Informtica

19

Threads (II)
( )
Todoslosthread comparten
Instruccionesdelosprocesos
Datos
Ficherosabiertos
Manejadoresyestadodelas
j
y
seales
Directorioactualdetrabajo
Iddeusuarioygrupo
Id d
i

CadaThread tienesupropio
Iddethread
Conjuntoderegistros,
Conjunto de registros
incluyendocontadorde
programaypunterodepila
Pila(paravariableslocalesy
retornodedirecciones)
errno
Mscaradeseales
Prioridad

Redes de Computadores II - Grado en Ingeniera Informtica

20

Threads (III)
( )

Existendostiposdethread
o Enelespaciodeusuario
En el espacio de usuario
o Enelkernel

pthread oPosix Thread.Estandarizadoen1995comopartedePosix.1c


L f i
Lasfuncionessondelaforma
d l f
o
o
o
o
o
o
o
o
o
o

pthread_create
pthread_join
pthread_self
pthread_detach
pthread_exit
pthread_attr_*
pthread_mutex_*
pthread cond *
pthread_cond_
pthread_rwlock_*
pthread_cancel

creaunthread
esperaelfinaldeunthread
devuelveeliddethread
elthread finalizaporsmismo
finalizaunthread
atributosdelthread
usoexclusivodeunthread aunrecurso
espera por una condicin
esperaporunacondicin
accesocompartidoparaleeryexclusivoparaescribir
pidelacancelacindeunthread

Redes de Computadores II - Grado en Ingeniera Informtica

21

Threads (IV)
( )
#include <stdio.h>//hola.c
#include <pthread.h>
void holamundo (
(void *ptr){
p ) {
printf("HolaMundo\n");
}
int main(int
(
argc,char
g ,
*argv[]){
g []) {
pthread_t hilo1;
int estado;
/*handler,atributosdelthread,funcin,argumentosdelafuncin*/
g
estado=pthread_create(&hilo1,NULL,(void *)&holamundo,NULL);
if (estado!=0)
printf ("ErroralcrearelThread\n");
estado=pthread_join(hilo1,NULL);
if (estado!=0)
printf("Thread unida\n");
return 0;
}
#makefile
LIBS=lpthread
hola:hola.o
$(CC)$(CFLAGS)$@.co$@$(LIBS)
Redes de Computadores II - Grado en Ingeniera Informtica

22

S-ar putea să vă placă și