Tema 5 Comunicación con sockets
|
|
|
- José Luis del Río Lara
- hace 9 años
- Vistas:
Transcripción
1 Tema 5 Comunicación con sockets Grupo ARCOS Grado en Ingeniería Informática Universidad Carlos III de Madrid
2 Contenido Conceptos básicos sobre sockets Modelo de comunicación Sockets Datagrama Stream API de programación Sockets en C Sockets en Java Guía de diseño de aplicaciones cliente-servidor 2
3 Sockets: introducción Mecanismo de IPC que proporciona comunicación entre procesos que ejecutan en máquinas distintas Aparecieron en 1981 en UNIX BSD 4.2 Intento de incluir TCP/IP en UNIX Diseño independiente del protocolo de comunicación Un socket es un descriptor de un punto final de comunicación (dirección IP y puerto) Abstracción que: Representa un extremo de una comunicación bidireccional con una dirección asociada Ofrece interfaz de acceso a los servicios de red en el nivel de transporte Protocolo TCP y UDP 3
4 Sockets: introducción Aplicaciones/servicios RMI and RPC Sockets Aplanamiento (marshalling), representación externa de datos Protocolo de transporte UDP y TCP 4
5 Sockets: introducción Sujetos a proceso de estandarización dentro de POSIX (POSIX g) Actualmente disponibles en: Casi todos los sistemas UNIX Prácticamente todos los sistemas operativos WinSock: API de sockets de Windows Macintosh En Java como clase nativa 5
6 Sockets UNIX Dominios de comunicación AF_UNIX AF_INET Tipos de sockets Stream (SOCK_STREAM) Datragrama (SOCK_DGRAM) Direcciones de sockets 6
7 Dominios de comunicación Un dominio representa una familia de protocolos Un socket está asociado a un dominio desde su creación Sólo se pueden comunicar sockets del mismo dominio Los servicios de sockets son independientes del dominio Ejemplos de dominios: AF_UNIX (o AF_LOCAL): comunicación dentro de una máquina AF_INET: comunicación usando protocolos TCP/IP 7
8 Tipos de sockets Stream (SOCK_STREAM) Protocolo TCP Datagrama (SOCK_DGRAM) Protocolo UDP Raw (SOCK_RAW) Sockets sin protocolo de transporte 8
9 Sockets stream Protocolo TCP (RFC 793) Flujo de datos bidireccional Orientado a conexión Debe establecerse una conexión extremo-a-extremo antes del envío y recepción de datos Proporcionan fiabilidad Paquetes ordenados por secuencia, sin duplicación de paquetes, libre de errores Ejemplos: HTTP, Telnet, FTP, SMTP 9
10 Sockets datagrama Protocolo UDP (RFC 768) Flujo de datos bidireccional No orientado a conexión No se establece/mantiene una conexión entre los procesos que comunican Un datagrama es una entidad autocontenida Longitud máxima de un datagrama (datos y cabeceras) es 64 KB Mantiene separación entre paquetes No proporcionan fiabilidad Paquetes desordenados, duplicados, pérdidas Ejemplos: DNS 10
11 Sockets: stream y datagramas socket API runtime support Process A Process B socket API runtime support transport layer software transport layer software connectionless datagram socket a datagram a logical connection created and maintained by the runtime support of the datagram socket API socket API runtime support Process A Process B socket API runtime support transport layer software transport layer software connection-oriented datagram socket 11
12 Correspondencia entre familia y tipos de sockets TIPO SOCKET AF_UNIX AF_INET SOCK_STREAM Yes TCP SOCK_DGRAM Yes UDP SOCK_RAW IP SOCK_SEQPACKT FAMILIA TIPO Protocolo Protocolo actual AF_INET SOCK_DGRAM IPPROTO_UDP UDP AF_INET SOCK_STREAM IPPROTO_TCP TCP AF_INET SOCK_RAW IPPROTO_ICMP ICMP AF_INET SOCK_RAW IPPROTO_RAW raw 12
13 Direcciones de sockets Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo Las direcciones se usan para: Asignar una dirección local a un socket (bind) Especificar una dirección remota (connect o sendto) Las direcciones son dependientes del dominio Se utiliza la estructura genérica struct sockaddr Cada dominio usa una estructura específica Direcciones en AF_UNIX (struct sockaddr_un) Nombre de fichero Direcciones en AF_INET(struct sockaddr_in) Es necesario la conversión de tipos (casting) en las llamadas 13
14 Puertos Un puerto identifica un destino en un computador Los puertos se asocian a procesos, de manera que permiten que la transmisión se dirija a un proceso específico en el computador destino Un puerto tiene un único receptor y múltiples emisores (excepto multicast) Toda aplicación que desee enviar y recibir datos debe abrir un puerto Número entero de 16 bits 2^16 puertos en una máquina ~ puertos posibles Reservados por la IANA para aplicaciones de Internet: (también llamados well-known puertos) Puertos entre 1024 y son puertos registrados para ser usados por los servicios Puertos por encima de para uso privado El espacio de puertos para streams y datagramas es independiente 14
15 Información asociada a una comunicación Protocolo TCP, UDP Dirección IP local (origen) Puerto local (origen) Dirección IP remota (destino) Puerto remoto (destino) (Protocolo, IP-local, P-local, IP-remoto, P-remoto) 15
16 Encapsulación de un paquete TCP Datos 16
17 Encapsulación de un paquete TCP Datos Puerto Origen Puerto Destino Cabecera TCP Datos 17
18 Encapsulación de un paquete TCP Datos Puerto Origen Puerto Destino Protocolo =TCP IP Origen IP Destino Cabecera IP Cabecera TCP Cabecera TCP Datos Datos 18
19 Encapsulación de un paquete TCP Datos Puerto Origen Puerto Destino Protocolo =TCP IP Origen IP Destino Cabecera IP Cabecera TCP Cabecera TCP Datos Datos Tipo de trama = IP Dirección Eth. Origen Dirección Eth. Destino Cabecera Ethernet Cabecera IP Cabecera TCP Datos Cola Ethernet 19
20 Direcciones IP Una dirección IP se almacena en una estructura de tipo in_addr #include <netinet/in.h> typedef uint32_t in_addr_t; struct in_addr { in_addr_t s_addr; }; 20
21 Direcciones de sockets en AF_INET Estructura struct sockaddr_in Debe iniciarse a 0 La estructura tiene tres campos importantes: sin_family: sin_port: sin_addr: #include <netinet/in.h> struct sockaddr_in { short u_short struct in_addr char }; dominio (AF_INET) puerto dirección del host sin_family; sin_port; sin_addr; sin_zero[8]; struct sockaddr_in family 2-byte port 4-byte Net ID, host ID unused 21
22 Direcciones de sockets en AF_UNIX La estructura struct sockaddr_un describe la dirección de un socket AF_LOCAL o AF_UNIX #include <sys/un.h> struct sockaddr_un { short sun_family; char sun_path[108]; }; struct sockaddr_un family Pathname (up to 108 bytes) 22
23 Servicios sobre direcciones Obtener el nombre de un host Transformar direcciones Obtener la dirección de un host Representación de datos Interna Externa 23
24 Obtener el nombre de un host Función que facilita el nombre de la máquina en la que se ejecuta: int gethostname(char *name, size_t namelen); donde: name namelen referencia al buffer donde se almacena el nombre longitud del buffer 24
25 Ejemplo I: obtener nombre host #include <unistd.h> void main () { char maquina[256]; int err; err = gethostname(maquina, 256); printf( Ejecuto en la maquina %s\n, maquina); } exit(0); 25
26 Transformación de direcciones The McGraw-Hill 26
27 Obtención de la dirección de host Usuarios manejan direcciones en forma de texto: Notación decimal-punto (ej: ) Notación dominio-punto (ej. Dos funciones de transformación de direcciones: Devuelve una dirección IP en notación decimal-punto char *inet_ntoa(struct in_addr in); Obtiene una dirección IP a partir de notación decimal punto int inet_aton(const char *cp, struct in_addr *in); 27
28 Ejemplo II: transformación de direcciones #include <netdb.h> #include <stdio.h> void main(int argc, char **argv){ struct in_addr in; if (argc!= 2) { printf("uso: %s <decimal-punto>\n", argv[0]); exit(0); } if (inet_aton(argv[1], &in) == 0) { printf("error en la dirección\n"); exit(0); } printf("la dirección es %s\n", inet_ntoa(in)); } exit(0); 28
29 Obtener la dirección de host Obtiene la información de un host a partir de una dirección en formato dominio-punto struct hostent *gethostbyname(char *str); Argumentos: str es el nombre de la máquina Obtiene la información de un host a partir de una dirección IP struct hostent *gethostbyaddr(void *addr, int len, int type); Argumentos: addr es un puntero a una estructura de tipo struct in_addr len es el tamaño de la estructura type es AF_INET 29
30 Estructura hostent The McGraw-Hill 30
31 Ejemplo III: obtener la dirección de host en dominio-punto #include <netdb.h> #include <stdio.h> #include <string.h> void main(int argc, char **argv) { struct hostent *hp; struct in_addr in; hp = gethostbyname( ); if (hp == NULL) { printf( Error en gethostbyname\n ); exit(0); } memcpy(&in.s_addr,*(hp->h_addr_list),sizeof(in.s_addr)); } printf( %s es %s\n, hp->h_name, inet_ntoa(in)); 31
32 Ejemplo IV: obtener la dirección de host en decimal-punto #include <netdb.h> #include <stdio.h> #include <string.h> main(int argc, const char **argv) { u_int addr; struct hostent *hp; char **p; struct in_addr in; char **q; if (argc!= 2) { printf("uso: %s Direccion-IP\n", argv[0]); exit (1); } err = inet_aton(argv[1], &addr); if (err == 0) { printf("direccion IP en formato a.b.c.d\n"); exit (2); } 32
33 Ejemplo IV: obtener la dirección de host en decimal-punto hp=gethostbyaddr((char *) &addr, sizeof (addr), AF_INET); if (hp == NULL) { printf( Error en...\ n); exit (3); } for (p = hp->h_addr_list; *p!=0;p++){ memcpy(&in.s_addr, *p, sizeof(in.s_addr)); printf("%s\t%s",inet_ntoa(in), hp->h_name); for (q=hp->h_aliases;*q!= 0; q++) printf("%s\n", *q); } } exit(0); 33
34 Orden de los bytes Big-endian es el estándar para el ordenamiento de los bytes usado en TCP/IP También llamado Network byte order Big-endian Little-endian 34
35 Ejemplo: Representación del 1 Big Endian MSB LSB Direcciones: Little Endian n n+1 n+2 n+3 Dirección de crecimiento LSB MSB Direcciones: n n+1 n+2 n+3 35 Dirección de crecimiento
36 Representación de datos Empaquetamiento de datos (marshalling): Serialización de las estructuras de datos y conversión de los valores de los datos a su representación externa Esto es una cadena Representación en el computador A -1.5 Desempaquetamiento de datos (unmarshalling) Conversión de los datos a su representación interna Esto es una cadena Representación en el computador B -1.5
37 Funciones de transformación: network host En computadores que no utilicen big-endian (ej. procesadores Intel) es necesario emplear funciones para traducir números entre el formato que utiliza TCP/IP (big-endian) y el empleado por el propio computador (little-endian) : Host (Little-Endian) Network (Big-Endian) Traduce un número de 32/16 bits representado en el formato del computador al formato de red (TCP/IP) u_long htonl(u_long hostlong) u_short htons(u_short hostshort) Network (Big-Endian) host (Little-Endian) Traduce un número de 32/16 bits representado en el formato de red (TCP/IP) al formato del computador u_long ntohl(u_long netlong) u_short ntohs(u_short netshort) 37
38 Funciones de transformación The McGraw-Hill 38
39 Modelos de comunicación Sockets stream (SOCK_STREAM) Orientado a conexión TCP Sockets datagrama (SOCK_DGRAM) No orientado a conexión UDP 39
40 Modelo de comunicación con sockets stream Proceso servidor Proceso cliente socket() bind() socket() connect() Conexión listen() accept() write() read() Petición Respuesta read() write() close() close() 40
41 Modelo de comunicación con sockets datagrama Proceso servidor Proceso cliente socket() bind() socket() sendto() recvfrom() Petición Respuesta recvfrom() sendto() close() close() 41
42 Primitivas POSIX para la gestión de sockets Creación de un socket (socket) Asignación de direcciones (bind) Preparar para aceptar conexiones (listen) Aceptar una conexión (accept) Solicitud de conexión (connect) Obtener la dirección de un socket Transferencia de datos Streams Datagramas Cerrar un socket (close) 42
43 Creación de un socket (socket) Crear un socket: #include <sys/types.h> #include <sys/socket.h> int socket(int dominio, int tipo, int protocolo) Argumentos: dominio AF_UNIX,AF_INET tipo SOCK_STREAM,SOCK_DGRAM protocolo dependiente del dominio y tipo 0 elige el más adecuado Especificados en /etc/protocols devuelve: si éxito, un descriptor de socket si error, -1 El socket creado no tiene dirección asignada 43
44 Ejemplo V: Crear un socket #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #define TCP 6 #define UDP 17 /* ver /etc/protocols */ int main() { /* VARIABLES DEL PROGRAMA */ int sockfd; } if ((sockfd=socket(af_inet, SOCK_STREAM, TCP))==-1) { printf( Error en la creación del socket ); exit(-1); } /* CONTINUACIÓN DEL PROGRAMA */ 44
45 Asignación de direcciones (bind) Asignar dirección a un socket: #include <sys/types.h> #include <sys/socket.h> int bind(int sd, struct sockaddr *dir, int long) Argumentos: sd dir long descriptor devuelto por socket dirección a asignar longitud de la dirección/tamaño de la estructura sockaddr devuelve 1 si error y 0 si se ejecutó con éxito Direcciones en dominio AF_INET (struct sockaddr_in) Host: una dirección local IP INNADDR_ANY: elige cualquiera de la máquina Puertos: puertos disponibles, de los cuales están reservados Si 0, el sistema elige uno Si no se asigna dirección al socket (típico en clientes) Se le asigna automáticamente (puerto efímero) en la su primera utilización (connect o sendto) 45
46 Obtener la dirección de un socket Obtener la dirección a partir del descriptor: int getsockname(int sd, struct sockaddr *dir, int *long) sd descriptor devuelto por socket dir dirección del socket devuelta long: parámetro valor-resultado (igual que en accept) Obtener la dirección del socket en el otro extremo de la conexión: int getpeername(int sd, struct sockaddr *dir, int *long) sd dir long descriptor devuelto por socket dirección del socket remoto parámetro valor-resultado 46
47 Preparar para aceptar conexiones (listen) Habilita un socket para recibir conexiones en el servidor TCP Realizada en el servidor stream después de socket y bind #include <sys/types.h> #include <sys/socket.h> int listen(int sd, int baklog) Argumentos: sd: backlog: descriptor devuelto por socket número máximo de peticiones que se encolarán (algunos manuales recomiendan 5) antes de ejecutar accept devuelve 1 si error y 0 si se ejecutó con éxito 47
48 Aceptar una conexión (accept) Realizada en el servidor stream después de socket, bind y listen Bloquea al servidor hasta que se produce la conexión; el servidor obtiene: La dirección del socket del cliente Un nuevo descriptor que queda conectado al socket del cliente Después de la conexión quedan activos dos sockets en el servidor: El original para aceptar nuevas conexiones El nuevo para enviar/recibir datos por la conexión establecida 48
49 Aceptar una conexión (accept) #include <sys/types.h> #include <sys/socket.h> int accept(int sd, struct sockaddr *dir, int *long) Argumentos: sd dir long descriptor devuelto por socket dirección del socket del cliente parámetro valor-resultado: 1) Antes de la llamada: tamaño de dir 2) Después de la llamada: tamaño de la dirección del cliente que se devuelve Devuelve un nuevo descriptor de socket asociado a la conexión -1 en caso de error 49
50 Solicitud de conexión (connect) Realizada en el cliente stream para conectarse al servidor #include <sys/types.h> #include <sys/socket.h> int connect(int sd, struct sockaddr *dir, int long) Argumentos: sd dir long descriptor devuelto por socket dirección del socket remoto longitud de la dirección devuelve 1 si error y 0 si se ejecutó con éxito Si el socket no tiene dirección asignada, se le asigna una automáticamente 50
51 Establecimiento de una conexión en TCP 51
52 Ejemplo VI: Establecimiento de conexión TCP (clientes) int main() { int sockfd; struct sockaddr_in server; Proceso cliente socket() Conexión connect() Petición write() Respuesta read() close() Proceso servidor socket() bind() listen() accept() read() write() close() if ((sockfd=socket(af_inet, SOCK_STREAM, 0))==-1){ printf( Error en la creación del socket ); exit(-1); } server.sin_family = AF_INET; server.sin_port = htons(port_server); server.sin_addr.s_addr = htonl(ip_server); } if (connect(sockfd,(struct sockaddr *)&server, sizeof(server)) <0) { printf( Error en el connect ); exit(-1); } /* CONTINUACION CODIGO CLIENTE */ 52
53 Ejemplo VI: Establecimiento de conexión TCP (servidores) Proceso cliente socket() Conexión connect() Proceso servidor socket() bind() listen() accept() int main() write() Petición read() { read() Respuesta write() int sd, newsd, size; close() close() struct sockaddr_in server, client; if ((sd=socket(af_inet, SOCK_STREAM, 0))==-1){ printf( Error en la creación del socket ); exit(-1); } server.sin_family = AF_INET; server.sin_port = htons(port_server); server.sin_addr.s_addr = htonl(ip_server); /* bind */ if (bind(sd,(struct sockaddr *)&server, sizeof(server)) <0) { printf( Error en el bind ); exit(-1); } 53
54 Ejemplo VI: continuación (servidores) Proceso cliente socket() Conexión connect() Proceso servidor socket() bind() listen() accept() listen(sd,5) for (;;) { if (newsd=accept (sd,(struct sockaddr *) &client, sizeof(client)) < 0) { } printf( Error en el accept ); exit(-1); /* transferir datos sobre newsd */. /* cerrar newsd */ } /* fin for */ /* cerrar sd */ } /* fin main */ write() read() close() Petición Respuesta read() write() close() 54
55 Transferencia de datos con streams Una vez establecida la conexión usando sockets stream, ambos extremos puede transferir datos Envío: int write(int sd, char *mem, int long); int send(int sd, const void *mem, size_t long, int flags); Devuelve el número de bytes enviados o 1 si error El cuarto parámetro flags permite especificar opciones de envío (man send) 0 si no opciones MSG_OOB MSG_DONTWAIT MSG_DONTROUTE Es importante comprobar siempre el valor que devuelven estas llamadas: pueden no transferirse todos los datos 55
56 Transferencia de datos con streams La recepción es una llamada bloqueante (síncrona) Recepción: int read(int sd, char *mem, int long); int recv(int sd, void *buf, size_t long, int flags); Devuelve el número de bytes recibidos o 1 si error El cuarto parámetro flags permite especificar opciones de recepción (man recv) 0 si no opciones MSG_OOB MSG_PEEK MSG_DONTROUTE Es importante comprobar siempre el valor que devuelven estas llamadas: pueden no transferirse todos los datos. 56
57 Ejemplo VII: Transferencia de datos con streams Función que envía un bloque de datos con reintentos: int enviar(int socket, char *mensaje, int longitud) { int r; int l = longitud; do { r = write(socket, mensaje, l); l = l r; mensaje = mensaje + r; } while ((l>0) && (r>=0)); } if (r < 0) return (-1); /* fallo */ else return(0); 57
58 Transferencia de datos con datagramas No hay conexión real Para usar un socket para transferir datos basta con: Crearlo (socket) Asignarle una dirección (bind) Si no se le asigna dirección, lo hará el sistema de manera transparente Envío: int sendto(int sd, char *buffer, int long, int flags, struct sockaddr *dir, int addrlen) Devuelve el número de bytes enviados o 1 si error Argumentos: sd descriptor de socket buffer puntero a los datos a enviar long la longitud de los datos flags opciones de envío (man sendto) dir dirección del socket remoto addrelnla longitud de la dirección 58
59 Transferencia de datos con datagramas Recepción: int recvfrom(int sd, char *buffer, int long, int flags, struct sockaddr *dir, int addrlen) Devuelve el número de bytes recibidos o 1 si error Argumentos: sd descriptor de socket buffer puntero a los datos a enviar long la longitud de los datos flags opciones de recepción (man recvfrom) dir dirección del socket del cliente addrlenla longitud de la dirección Es importante comprobar siempre el valor que devuelven estas llamadas: pueden no transferirse todos los datos. 59
60 Cerrar un socket (close) Se usa close para cerrar ambos tipos de sockets (stream y datagrama) int close(int sd); Si el socket es de tipo stream, cierra la conexión en ambos sentidos Devuelve 1 si error Se puede cerrar un único extremo: int shutdown(int sd, int modo); sd descriptor devuelto por socket modo SHUT_RD, SHUT_RW o SHUT_RDWR Devuelve 1 si error 60
61 Conexión con TCP Servidor (host-a, 22) cliente (host-b, 1500) (tcp, host-a, 22, -, -) (tcp, host-b, 1500, -, -) 61
62 Conexión con TCP Servidor (host-a, 22) cliente (host-b, 1500) accept() (tcp, host-a, 22, -, -) (tcp, host-b, 1500, -, -) 62
63 Conexión con TCP Servidor cliente (host-a, 22) (host-b, 1500) accept() (tcp, host-a, 22, -, -) connect() (tcp, host-b, 1500, -, -) 63
64 Conexión con TCP Servidor cliente (host-a, 22) (host-b, 1500) accept() (tcp, host-a, 22, -, -) connect() (tcp, host-b, 1500, -, -) Nuevo descriptor de socket fork() (tcp, host-a, 22, host-b, 1500) 64
65 Conexión con TCP Servidor (host-a, 22) cliente (host-b, 1500) (tcp, host-a, 22, -, -) (tcp, host-b, 1500, host-a, 22) (tcp, host-a, 22, host-b, 1500) Conexión 65
66 Conexión con TCP Servidor (host-a, 22) cliente (host-b, 1500) accept() (tcp, host-a, 22, -, -) (tcp, host-b, 1500, host-a, 22) (tcp, host-a, 22, host-b, 1500) Conexión 66
67 Conexión con TCP Servidor (host-a, 22) cliente (host-b, 1500) accept() (tcp, host-a, 22, -, -) (tcp, host-b, 1500, host-a, 22) Conexión (tcp, host-a, 22, host-b, 1500) cliente (host-c, 4000) (tcp, host-c, 4000, -, -) 67
68 Conexión con TCP Servidor (host-a, 22) cliente (host-b, 1500) accept() (tcp, host-a, 22, -, -) (tcp, host-b, 1500, host-a, 22) connect() Conexión (tcp, host-a, 22, host-b, 1500) cliente (host-c, 4000) (tcp, host-c, 4000, -, -) 68
69 Conexión con TCP Servidor (host-a, 22) cliente (host-b, 1500) accept() (tcp, host-a, 22, -, -) (tcp, host-b, 1500, host-a, 22) Conexión (tcp, host-a, 22, host-b, 1500) Nuevo descriptor de socket fork() (tcp, host-a, 22, host-c, 4000) cliente (host-c, 4000) (tcp, host-c, 4000, -, -) 69
70 Conexión con TCP Servidor (host-a, 22) cliente (host-b, 1500) (tcp, host-a, 22, -, -) (tcp, host-b, 1500, host-a, 22) Conexión (tcp, host-a, 22, host-b, 1500) cliente (host-c, 4000) Conexión (tcp, host-a, 22, host-c, 4000) (tcp, host-c, 4000, host-a, 22) 70
71 Configuración de opciones Existen varios niveles dependiendo del protocolo afectado como parámetro SOL_SOCKET: opciones independientes del protocolo IPPROTO_TCP: nivel de protocolo TCP IPPTOTO_IP: nivel de protocolo IP Consultar opciones asociadas a un socket int getsockopt (int sd, int nivel, int opc, char *val, int *long) Modificar las opciones asociadas a un socket int setsockopt (int sd, int nivel, int opc, char *val, int long) Ejemplos (nivel SOL_SOCKET): SO_REUSEADDR: permite reutilizar direcciones 71
72 Por qué utilizar SO_REUSEADDR? TCP mantiene las conexiones bloqueadas durante un cierto tiempo (TIME_WAIT) La conexión ya ha sido cerrada y no puede utilizarse, pero todavía no se han eliminado las tablas internas asociadas por si permanecen todavía segmentos en tránsito en la red int val = 1; setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *) &val, sizeof(int)); 72
73 SO_RCVBUF, SO_SNDBUF Buffer de envío y recepción Fijar el tamaño del buffer de envío: int size = 16384; err = setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&size, (int)sizeof(size)); Conocer el tamaño del buffer de envío: int size; err = getsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *)&size,(int)sizeof(size)); printf( %d\n, size) 73
74 TCP_NODELAY Envío inmediato (sin intentar agrupar mensajes relativamente juntos en el tiempo) int option = 1; rc = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &option, sizeof(option)); 74
75 Sockets de Java El paquete java.net de Java permite crear sockets TCP/IP Clases para sockets datagrama: DatagramSocket DatagramPacket Clases para sockets stream: ServerSocket Socket 75
76 Sockets datagrama DatagramPacket: Implementa un objeto que permite enviar o recibir paquetes Constructor: DatagramPacket Métodos: getaddress, getport,... ket.html DatagramSocket: Implementa un socket que se puede utilizar para enviar o recibir datagramas. Constructor: DatagramSocket Métodos: send, receive, close, setsotimetout, getsotimeout,... ket.html 76
77 Sockets datagrama Proceso emisor Vector de bytes Proceso receptor Vector de bytes Dirección del receptor Objeto DatagramPacket Objeto DatagramPacket send Objeto DatagramSocket receive Objeto DatagramSocket Referencia a objeto Flujo de datos 77
78 Sockets stream La clase socket implementa un socket stream Socket(InetAddress dirección, int puerto) OutputStream getoutputstream() flush InputStream getinputstream() void setsotimeout(int tiempo_de_espera) La clase ServerSocket implementa un socket a utilizar en los servidores para esperar la conexiones de los clientes socket accept() void close() void setsotimeout(int tiempo_de_espera) et.html 78
79 Ejemplo XI: Modelo de comunicación Servidor Cliente ServerSocket(puerto); socket(host, puerto) accept(); OutputStream InputStream InputStream OutputStream close() close() 79
80 Guía de diseño de aplicaciones clienteservidor Modelo de comunicación: conexión/no conexión Servidor secuencial/concurrente Problemas de concurrencia Comunicación síncrona/asíncrona Localización: Dirección IP y puerto en destino Formato de los datos Orden de los bytes: big-endian/little-endian Opciones de los sockets Protocolo de servicio Fiabilidad Gestión de errores (UDP) 80
81 Comparación de protocolos IP UDP TCP Orientado a conexión? No No Si Límite entre mensajes? Si Si No Ack? No No Si Timeout y retransmisión? No No Si Detección de duplicación? No No Si Secuenciamiento? No No Si Flujo de control? No No Si 81
82 Modelo de servidor secuencial El servidor sirve las peticiones de forma secuencial Mientras está atendiendo a un cliente no puede aceptar peticiones de más clientes petición Cliente servidor respuesta 82
83 Ejemplo VIII: Programar un servidor y cliente en TCP Máquina A cliente sumar(5,2) Máquina B servidor 5+2 NÚCLEO Resultado = 7 NÚCLEO RED 83
84 Ejemplo VIII: Modelo de comunicación Proceso servidor Proceso cliente socket() bind() socket() connect() Conexión listen() accept() write() read() Petición Respuesta read() write() close() close() 84
85 Proceso servidor Ejemplo VIII: Servidor TCP #include <sys/types.h> #include <sys/socket.h> void main(int argc, char *argv[]) { struct sockaddr_in server_addr, client_addr; int sd, sc; int size, val; int size; int num[2], res; if ((sd = socket(af_inet, SOCK_STREAM, IPPROTO_TCP))<0) printf ( SERVER: Error en el socket ); Proceso cliente socket() Conexión connect() Petición write() Respuesta read() close() socket() bind() listen() accept() read() write() close() val = 1; setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *) &val, sizeof(int)); bzero((char *)&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(4200); bind(sd, &server_addr, sizeof(server_addr)); 85
86 Proceso servidor Ejemplo VIII: Servidor TCP Proceso cliente socket() Conexión connect() socket() bind() listen() accept() listen(sd, 5); size = sizeof(client_addr); write() read() close() Petición Respuesta read() write() close() while (1) { printf("esperando conexion\n"); sc = accept(sd, (struct sockaddr *)&client_addr,&size); read ( sc, (char *) num, 2 *sizeof(int)); // recibe la petición } res = num[0] + num[1]; write(sc, &res, sizeof(int)); close(sc); // procesa la petición // envía el resultado // cierra la conexión (sc) close (sd); exit(0); } /*fin main */ 86
87 Proceso servidor Ejemplo VIII: Cliente TCP #include <sys/types.h> #include <sys/socket.h> void main(int argc, char **argv) // en argv[1] == servidor { int sd; struct sockaddr_in server_addr; struct hostent *hp; int num[2], res; if (argc!= 2){ printf("uso: cliente <direccion_servidor> \n"); exit(0); } sd = socket(af_inet, SOCK_STREAM, IPPROTO_TCP); bzero((char *)&server_addr, sizeof(server_addr)); hp = gethostbyname (argv[1]); memcpy (&(server_addr.sin_addr), hp->h_addr, hp->h_length); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(4200); Proceso cliente socket() Conexión connect() Petición write() Respuesta read() close() socket() bind() listen() accept() read() write() close() 87
88 Proceso servidor Ejemplo VIII: Cliente TCP Proceso cliente socket() Conexión connect() socket() bind() listen() accept() write() Petición read() Respuesta read() // se establece la conexión close() connect(sd, (struct sockaddr *) &server_addr, sizeof(server_addr)); write() close() num[0]=5; num[1]=2; write(sd, (char *) num, 2 *sizeof(int)); // envía la petición read(sd, &res, sizeof(int)); // recibe la respuesta printf("resultado es %d \n", res); close (sd); exit(0); } /* fin main */ 88
89 Ejemplo IX: Programar un servidor y cliente en UDP Máquina A cliente sumar(5,2) Máquina B servidor 5+2 NÚCLEO Resultado = 7 NÚCLEO RED 89
90 Ejemplo IX: Modelo de comunicación Proceso servidor Proceso cliente socket() bind() socket() sendto() recvfrom() Petición Respuesta recvfrom() sendto() close() close() 90
91 Ejemplo IX: Servidor UDP #include <sys/types.h> #include <sys/socket.h> Proceso cliente Proceso servidor socket() bind() socket() Petición sendto() recvfrom() Respuesta recvfrom() sendto() close() close() void main(void) { int num[2]; int s, res, clilen; struct sockaddr_in server_addr, client_addr; s = socket(af_inet, SOCK_DGRAM, 0); bzero((char *)&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(7200); bind(s, (struct sockaddr *)&server_addr, sizeof(server_addr)); 91
92 Ejemplo IX: Servidor UDP Proceso cliente socket() Proceso servidor socket() bind() clilen = sizeof(client_addr); sendto() recvfrom() Petición Respuesta recvfrom() sendto() close() close() while (1) { recvfrom(s, (char *) num, 2* sizeof(int), 0, (struct sockaddr *)&client_addr, &clilen); res = num[0] + num[1]; } sendto(s, (char *)&res, sizeof(int), 0, (struct sockaddr *)&client_addr, clilen); } /* fin main */ 92
93 Ejemplo IX: Cliente UDP Proceso cliente socket() Proceso servidor socket() bind() void main(int argc, char *argv[]) { struct sockaddr_in server_addr, client_addr; struct hostent *hp; int s, num[2], res; sendto() recvfrom() close() Petición Respuesta recvfrom() sendto() close() if (argc!= 2){ printf("uso: cliente <direccion_servidor> \n"); exit(0); } s = socket(af_inet, SOCK_DGRAM, 0); hp = gethostbyname (argv[1]); bzero((char *)&server_addr, sizeof(server_addr)); memcpy (&(server_addr.sin_addr), hp->h_addr, hp->h_length); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(7200); 93
94 Ejemplo IX: Cliente UDP bzero((char *)&client_addr, sizeof(client_addr)); client_addr.sin_family = AF_INET; client_addr.sin_addr.s_addr = INADDR_ANY; client_addr.sin_port = htons(0); Proceso cliente Proceso servidor socket() bind() socket() Petición sendto() recvfrom() Respuesta recvfrom() sendto() close() close() bind (s, (struct sockaddr *)&client_addr, sizeof(client_addr)); num[0] = 2; num[1] = 5; sendto(s, (char *)num, 2 * sizeof(int), 0, (struct sockaddr *) &server_addr, sizeof(server_addr)); recvfrom(s, (char *)&res, sizeof(int), 0, NULL, NULL); } printf("2 + 5 = %d\n", res); close(s); 94
95 Problemas de los ejemplos anteriores Comprobación de errores. Muy importante Problemas en la transferencia de los datos Ordenamiento de los bytes Qué ocurre si el cliente es little-endian y el servidor big-endian? Hay que resolver el problema de la representación de los datos. Una posibilidad es utilizar las funciones: u_long htonl(u_long hostlong) u_short htons(u_short hostshort) u_long ntohl(u_long netlong) u_short ntohs(u_short netshort) Definir el formato de representación e intercambio de datos Los datos que se envian a la red deben estar en Network Byte Order Los datos que se reciben de la red deben estar en Host Byte Order 95
96 Ejemplo X: Programar un servidor y cliente usando sockets datagramas de Java Máquina A cliente NÚCLEO sumar(5,2) Resultado = 7 Máquina B servidor 5+2 NÚCLEO RED 96
97 Ejemplo X: Cliente (datagramas) import java.lang.* ; import java.io.* ; import java.net.* ; import java.util.* ; public class client{ public static void main ( String [] args) { byte bsend[] = new byte[100]; byte brecv[] = new byte[100]; InetAddress server_addr = null; DatagramSocket s = null; DatagramPacket in = null; DatagramPacket out = null; int res; int num[] = new int[2]; 97 if (args.length!= 1) { System.out.println("Uso: cliente <host>"); System.exit(0); }
98 Ejemplo X: Cliente (datagramas) try { // se crea el socket del cliente s = new DatagramSocket(); // direción del servidor server_addr = InetAddress.getByName(args[0]); num[0] = 2; num[1] = 5; // empaquetar los datos. ByteArrayOutputStream baos = new ByteArrayOutputStream() ; ObjectOutputStream dos = new ObjectOutputStream(baos); dos.writeobject(num); bsend = baos.tobytearray() ; // se obtiene el buffer (datagrama) // un único envio out = new DatagramPacket (bsend, bsend.length, server_addr, 2500); s.send(out); 98
99 Ejemplo X: Cliente (datagramas) // se recibe el datagrama de respuesta in = new DatagramPacket (brecv, 100); s.receive(in); // se obtiene el buffer brecv = in.getdata(); // se desempaqueta ByteArrayInputStream bais = new ByteArrayInputStream(brecv) ; DataInputStream dis = new DataInputStream(bais); } } res = dis.readint(); System.out.println("Datos recibidos " + res); } catch (Exception e) { System.err.println("<<<<<excepcion " + e.tostring() ); e.printstacktrace() ; } 99
100 Ejemplo X: Servidor (datagramas) import java.lang.* ; import java.io.* ; import java.net.* ; import java.util.* ; public class servidor { public static void main ( String [] args) { DatagramSocket s = null; DatagramPacket in, out; InetAddress client_addr = null; int client_port; byte brecv[] = new byte[100]; byte bsend[] = new byte[100]; int num[], res; try { s = new DatagramSocket(2500); in = new DatagramPacket(brecv, 100); // paquete para recibir la solicitud 100
101 Ejemplo X: Servidor (datagramas) while (true) { s.receive(in); //esperamos a recibir // obtener datos brecv = in.getdata(); client_addr = in.getaddress(); client_port = in.getport(); // desempaquetar los datos ByteArrayInputStream bais = new ByteArrayInputStream(brecv); ObjectInputStream dis = new ObjectInputStream(bais); num = (int[])dis.readobject(); res = num[0] + num[1]; 101
102 Ejemplo X: Servidor (datagramas) ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeint(res); bsend = baos.tobytearray(); out = new DatagramPacket ( bsend, bsend.length,client_addr, client_port); s.send(out); } } catch(exception e) { System.err.println("excepcion " + e.tostring() ); e.printstacktrace() ; } } } 102
103 Ejemplo XI: Programar un servidor y cliente usando sockets stream de Java Máquina A cliente NÚCLEO sumar(5,2) Resultado = 7 Máquina B servidor 5+2 NÚCLEO RED 103
104 Ejemplo XI: Servidor stream import java.lang.* ; import java.io.* ; import java.net.* ; import java.util.* ; public class servidor { public static void main ( String [] args) { ServerSocket serveraddr = null; Socket sc = null; int num[] ; // petición int res; try { serveraddr = new ServerSocket(2500); } catch (Exception e){ System.err.println("Error creando socket"); } 104
105 Ejemplo XI: Servidor stream while (true){ try { sc = serveraddr.accept(); // esperando conexión InputStream istream = sc.getinputstream(); ObjectInput in = new ObjectInputStream(istream); num = (int[]) in.readobject(); res = num[0] + num[1]; DataOutputStream ostream = new DataOutputStream(sc.getOutputStream()); ostream.writeint(res); ostream.flush(); } } 105 } sc.close(); } catch(exception e) { System.err.println("excepcion " + e.tostring() ); e.printstacktrace() ; }
106 Ejemplo XI: Cliente streams import java.lang.* ; import java.io.* ; import java.net.* ; import java.util.* ; public class client { public static void main ( String [] args) { int res; int num[] = new int[2]; if (args.length!= 1) { System.out.println("Uso: cliente <host>"); System.exit(0); } try { // se crea la conexión String host = args[0]; Socket sc = new Socket(host, 2500); // conexión 106
107 Ejemplo XI: Cliente stream OutputStream ostream = sc.getoutputstream(); ObjectOutput s = new ObjectOutputStream(ostream); DataInputStream istream = new DataInputStream(sc.getInputStream()); num[0] = 5; num[1] = 2; //prepara la petición s.writeobject(num); s.flush(); res = istream.readint(); } } sc.close(); System.out.println("La suma es " + res); } catch (Exception e){ System.err.println("excepcion " + e.tostring() ); e.printstacktrace() ; } 107
108 Modelo de servidor concurrente El servidor crea un hijo que atiende la petición y envía la respuesta al cliente Se pueden atender múltiples peticiones de forma concurrente Cliente petición servidor Crea un proceso hijo respuesta Proceso hijo 108
109 Servidores concurrentes con sockets stream Proceso servidor Proceso cliente socket() bind() socket() listen() connect() Abrir conexión accept() Crear proceso hijo write() Petición read() read() Respuesta write() close() close() 109
110 Modelo de comunicación con sockets datagrama Proceso servidor Proceso cliente socket() bind() socket() sendto() recvfrom() Petición Respuesta recvfrom() Crear proceso hijo sendto() close() close() 110
111 Tipos de servidores concurrentes Un proceso servidor concurrente puede crear dos tipos de procesos: Procesos convencionales (fork) Procesos ligeros (threads) 111
112 Procesos concurrentes con fork El servidor crea un socket s y le asocia una dirección El cuerpo principal del servidor es: for(;;) { sd = accept(s, (struct sockaddr *)& &cliente, &len); } pid = fork(); /* El hijo hereda el descriptor de socket */ if (pid == -1) printf( Imposible crear mas hijos \n ); else if (pid == 0)/* proceso hijo */ { close (s); tratar_peticion(sd); close(sd); exit(0); } close(sd); /* el padre */ 112
113 Procesos concurrentes con fork En el modelo anterior el proceso padre no espera la terminación de los procesos hijos con wait Los procesos hijos cuando mueren quedan en estado zombie (no desaparecen del sistema) Para que los procesos hijos no queden zombies se puede ejecutar en el padre (sólo para UNIX System V): signal(sigchld, SIG_IGN); 113
114 Servidores concurrentes con P. ligeros petcición Cliente servidor Crea thread de servicio respuesta Thread de servicio 114
115 Procesos concurrentes con threads El servidor crea un socket s y le asocia una dirección El cuerpo principal del servidor es: pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); for(;;) { sd = accept(s, (struct sockaddr *)& &cliente, &len); pthread_create(&thid, &attr, tratar_peticion, &sd); } La función que ejecuta el proceso ligero es: void tratar_peticion(int * s) { int s_local; } s_local = *s; /* tratar la petición utilizando el descriptor de s_local */ close(s_local); pthread_exit(null); Es correcta esta solución? 115
116 Necesario sincronización La solución anterior es incorrecta ya que los procesos padre e hijo compiten por el acceso al descriptor (sd) devuelto por accept El proceso ligero hijo creado podría usar sd en tratar_petición mientras que un nuevo sd es asignado en accept Condiciones de carrera Necesario sincronizar las acciones con mutex y variables condicionales En el proceso servidor principal En los procesos ligeros hijos 116
117 Necesario sincronización El proceso ligero principal debe ejecutar: for(;;) { sd = accept(s, (struct sockaddr *) &cliente, &len); pthread_create(&thid, &attr, tratar_peticion, &sd); /* esperar a que el hijo copie el descriptor */ } pthread_mutex_lock(&m); while(busy == TRUE) pthread_cond_wait(&m, &c); busy = TRUE; pthread_mutex_unlock(&m); 117
118 Necesario sincronización El proceso ligero hijo debe ejecutar: void tratar_peticion(int * s) { int s_local; pthread_mutex_lock(&m); s_local = *s; busy = FALSE; pthread_cond_signal(&c); pthread_mutex_unlock(&m); } /* tratar la petición utilizando el descriptor s_local */ pthread_exit(null); 118
119 Servidor concurrente en Java (streams) while (true){ try { Socket cliente = serveraddr.accept(); new TratarPeticion(cliente).start(); } catch(exception e) { System.err.println("excepcion " + e.tostring() ); e.printstacktrace() ; } } } } 119
120 Servidor concurrente en Java (streams) class TratarPeticion extend Thread { private Socket sc; TratarPeticion(Socket s) { } sc = s; public void run() { // TODO: código del cliente } 120
121 Bibliografía y ejemplos Ejemplos de programas usando sockets: Ejemplo de sockets Ejemplo de uso de sockets en Java Sockets en Java Programas de ejemplos de sockets y RPC 121
122 Tema 5 Comunicación con sockets Grupo ARCOS Grado en Ingeniería Informática Universidad Carlos III de Madrid
Sistemas Operativos Distribuidos
Sockets Sistemas Distribuidos Sockets Aparecieron en 1981 en UNIX BSD 4.2 Intento de incluir TCP/IP en UNIX. Diseño independiente del protocolo de comunicación. Un socket es punto final de comunicación
Sistemas Distribuidos. Sockets
Sistemas Distribuidos Sockets Sockets Aparecieron en 1981 en UNIX BSD 4.2 Intento de incluir TCP/IP en UNIX. Diseño independiente del protocolo de comunicación. Un socket es punto final de comunicación
Tema 3: COMUNICACIÓN ENTRE PROCESOS
Tema 3: COMUNICACIÓN ENTRE PROCESOS E. U. Informática en Segovia Departamento de Informática Universidad de Valladolid 1 Introducción Estudia las comunicaciones punto a punto entre los lados de un enlace
Estructuras y funciones de programación de sockets.
Estructuras y funciones de programación de sockets. Introducción. Autor: Enrique Bonet En estos apuntes se incluye una breve descripción de las estructuras y funciones cuyo uso puede ser necesario para
BOLETIN 8 INDICE. ordenación de bytes. conversión de nombre y direcciones.
Sockets BOLETIN 8 INDICE 1. Introducción. 2. Tipos de sockets. 3. socket() 4. bind() 5. listen() 6. accept() 7. connect() 8. send()/recv(). 1. Funciones de ordenación de bytes 2. Funciones de conversión
Sockets: funcionamiento y programación. Sockets tipo UNIX. MSc. Ivan A. Escobar
Sockets tipo UNIX MSc. Ivan A. Escobar Creación socket: socket() int socket(familia, tipo, protocolo) Regresa un valor entero Parecido descriptor de archivos: descriptor socket sockfd int familia familia
Cliente/Servidor en Java
Cliente/Servidor en Java Grupo ARCOS Desarrollo de Aplicaciones Distribuidas Ingeniería Informática Universidad Carlos III de Madrid Contenidos 1. Introducción: 1. Paradigma cliente/servidor 2. Entorno
ARQUITECTURA DE REDES Laboratorio
1nsloo.cl ARQUITECTURA DE REDES Laboratorio Práctica 2: Ejercicios de aplicación de Sockets en C 1. OBJETIVOS. El objetivo de esta práctica es que el alumno llegue a conocer los principales conceptos relacionados
-> Todo socket viene definido por dos características fundamentales:
LOS SOCKETS. Los sockets no son más que puntos o mecanismos de comunicación entre procesos que permiten que un proceso hable (emita o reciba información) con otro proceso incluso estando estos procesos
Estructuras y funciones de programación de sockets.
Estructuras y funciones de programación de sockets. Introducción. En estos apuntes se incluye una breve descripción de las estructuras y funciones cuyo uso puede ser necesario para el desarrollo de las
Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP. Laboratorio de Comunicación de Datos ITT Telemática Septiembre 2011
Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP Laboratorio de Comunicación de Datos ITT Telemática Septiembre 2011 Introducción Aplicaciones Distribuidas Su funcionalidad se distribuye
Tema 4 Sockets: Un interfaz con TCP/IP
1 Tema 4 Sockets: Un interfaz con TCP/IP Capítulos: Introducción. Conceptos básicos. Dirección de un socket. Llamadas básicas de los sockets. Diferencias entre BSD-Sockets y WinSockets. Asignación de puertos
Introducción de Sockets en C.
PRÁCTICA 2: Introducción de Sockets en C. 1 La Interfaz Socket es una API para redes TCP/IP que se compone de funciones o rutinas. Originalmente se construyó a principios de los 80 para el sistema operativo
Tema 4: Sockets: Un interfaz con TCP/IP
Tema 4: Sockets: Un interfaz con TCP/IP Introducción. Conceptos básicos. Dirección de un socket. Llamadas básicas de los sockets. Diferencias entre BSD-Sockets y WinSockets. Asignación de puertos a procesos.
Diseño de aplicaciones distribuidas ÍNDICE
Aplicaciones Distribuidas (s) Aplicaciones Distribuidas (s) TCP TCP Protocolos de Protocolos de Transporte Transporte UDP UDP STREAM STREAM (TCP) (TCP) SOCKET SOCKET Etapas en la Creación Etapas en la
Mecanismos IPC: sockets
Mecanismos IPC: sockets Ampliación de Sistemas Operativos (prácticas) E.U. Informática en Segovia Universidad de Valladolid Sockets Los sockets son una abstracción lógica que permiten la comunicación bidireccional
COMUNICACIÓN Sistemas Distribuidos
COMUNICACIÓN Sistemas Distribuidos Alvaro Ospina Sanjuan Universidad Pontificia Bolivariana Medellín 2010 Agenda Comunicación centralizada y distribuida Protocolos con capas Modelo cliente servidor Sockets
Migrando aplicaciones a IPv6
Migrando aplicaciones a Fundamentos técnico: DualStack y Socket.h Alonso Sandoval A. Hernán Vargas L. Universidad Técnica Federico Santa María [email protected], [email protected]
Programación con sockets
Programación con sockets Internetworking with TCP/IP Client/Server Programming and Applications: Linux/POSIX Sockets Version Douglas E. Comer David L. Stevens Capítulos: 2, 5, 7 Grupo de Sistemas y Comunicaciones
1_servicio_eco_stream_secuencial/eco_clie_tcp.c Tue Mar 09 09:57:
1_servicio_eco_stream_secuencial/eco_clie_tcp.c Tue Mar 09 09:57:01 2010 1 #include #include int s, leido; struct sockaddr_in dir; struct hostent *host_info; host_info=gethostbyname("localhost");
Desarrollo de Aplicaciones Distribuidas. Sockets. Daniel Avellaneda
Desarrollo de Aplicaciones Distribuidas Sockets Daniel Avellaneda Sockets en Java Qué es un Socket Un socket es una abstracción a través de la cual una aplicación pueden mandar y recibir datos. Un socket
Arquitecturas cliente/servidor
Arquitecturas cliente/servidor Creación de Sockets Cliente Servidor Creación de Sockets Cliente/Servidor Sockets en TCP Sockets en UDP Definición de DAEMON Concepto de Hilos Qué es un socket? Un socket
Redes de Computadores Nivel de Aplicación: Programación con sockets I
Redes de Computadores Nivel de Aplicación: Programación con sockets I Área de Ingeniería Telemática Dpto. Automática y Computación http://www.tlm.unavarra.es/ En clases anteriores... El nivel de aplicación
Adaptación de aplicaciones a IPv6
Adaptación de aplicaciones a IPv6 extensión de la interfaz de sockets Eva M. Castro [email protected] Tutorial IPv6 -Adaptación de aplicaciones a IPv6 1 Contenido * Introducción Modelo de sockets BSD
Paso de mensajes en Java
Paso de mensajes en Java Grupo ARCOS Desarrollo de Aplicaciones Distribuidas Ingeniería Informática Universidad Carlos III de Madrid Contenidos 1. Introducción: 1. Paradigma de paso de mensajes 2. Entorno
Ingeniería Técnica de Telecomunicación, esp. Telemática Universidad de Jaén
Contenido. Introducción Primitivas Sockets orientadas a conexión (TCP) Primitivas orientadas a no conexión (UDP) Programación con Sockets en Internet Funciones sockets Funciones auxiliares 1 Bibliografía.
Clase de Sockets en lenguaje C. Prof. Ricardo González
Clase de Sockets en lenguaje C Prof. Ricardo González 1 Modelo de Programación Cliente-Servidor Cliente: un programa que envía peticiones. Servidor: un programa que ofrece un servicio que satisface peticiones
Práctica 2 Programación de Aplicaciones Distribuidas: Sockets TCP. Laboratorio de Comunicación de Datos ITT Telemática 26 de Septiembre 2011
Práctica 2 Programación de Aplicaciones Distribuidas: Sockets TCP Laboratorio de Comunicación de Datos ITT Telemática 26 de Septiembre 2011 Introducción Aplicaciones Orientadas a Conexión TCP:Servicio
Sockets (TCP) Tema 2.- Nivel de aplicación en Internet
Sockets (TCP) Tema 2- Nivel de aplicación en Internet Dr Daniel Morató es de Computadores Ingeniero Técnico en Informática de Gestión, 2º curso Material parcialmente adaptado del libro Computer Networking:
UNIVERSIDAD DE CANTABRIA DEPARTAMENTO DE INGENIERÍA DE COMUNICACIONES GRUPO DE INGENIERÍA TELEMÁTICA
UNIVERSIDAD DE CANTABRIA DEPARTAMENTO DE INGENIERÍA DE COMUNICACIONES GRUPO DE INGENIERÍA TELEMÁTICA MANUAL DE SOCKETS EN C TABLA DE CONTENIDOS Introducción.. 4 Sockets en C.. 7 2.1 Conceptos Básicos..
Capítulo 5. Programación de aplicaciones de red
Capítulo 5. Programación de aplicaciones de red Redes de Ordenadores 2º Grado en Ingeniería en Tecnologías de Telecomunicación 1 Área de Ingeniería Telemática Capítulo 5: Programación de aplicaciones de
Arquitecturas Cliente/Servidor
Arquitecturas Cliente/Servidor Integrantes: Arellano Santiago Víctor Manuel Girón Capistrán Aldo Iván Guerrero Ramirez Eduardo Daniel Rosas Peña Ramiro SOCKETS EN C. LLAMADAS PARA EL MANEJO DE SOCKETS
Sockets. Los sockets son un mecanismo de comunicación entre procesos que se utiliza en Internet.
Sockets La biblioteca estándar de clases de Java nos proporciona todo lo que necesitamos para utilizar sockets en nuestras aplicaciones en el paquete java.net, por lo que tendremos que añadir la siguiente
sockets Flujo (SOCK_STREAM) Comunicación bidireccional Confiable (entrega garantizada) Información ordenada en el destino Datagrama (SOCK_DGRAM)
s s Comunicación punto-a-punto entre procesos Los s son los extremos de la comunicación Diferentes dominios UNIX: Entre procesos de un mismo equipo Internet: Entre procesos de diferentes equipos (TCP/IP)
Introducción a la programación con sockets en C
Introducción a la programación con sockets en C Enrique Bonet Departamento de Informática Universidad de Valencia Índice Introducción Socket Creación de un socket Cierre de un socket Asociación de un socket
DESARROLLO DE APLICACIONES DISTRIBUIDAS. SOCKETS en UNIX
DESARROLLO DE APLICACIONES DISTRIBUIDAS PRÁCTICAS CURSO 2002-2003 SOCKETS en UNIX 1. Los SOCKETS en OSI/ISO - Como ya conocéis, el modelo OSI/ISO estructura los diferentes elementos que conforman una red
Desarrollo de Aplicativos con winsockets
Seminario de Redes de Computadoras 66.48 Desarrollo de Aplicativos con winsockets Docentes: Ing. Marcelo Utard Ing. Pablo Ronco Alumnos: Baños, Germán Gámez, Pablo Rabino, Juan Pablo Salas, Federico Introducción
Sistemas operativos: una visión aplicada. Capítulo 10 Introducción a los sistemas distribuidos
Sistemas operativos: una visión aplicada Capítulo 10 Introducción a los sistemas distribuidos Contenido Sistemas distribuidos Sistemas operativos distribuidos Comunicación de procesos Sincronización de
Tema 2. Comunicación entre procesos
Tema 2. Comunicación entre procesos SCS Sistemas Cliente/Servidor 4 o informática http://ccia.ei.uvigo.es/docencia/scs octubre 2008 FJRP, FMBR 2008/09 ccia SCS 2.1 Requisitos y alternativas Sistemas distribuidos
Qué es un socket? Dominios de comunicación. Tipos de sockets en el dominio AF_INET. Sockets Stream. Sockets Datagram. Sockets Raw
Qué es un socket? Es una interfaz de entrada salida de datos que permite la intercomunicación entre procesos. Los procesos pueden estar ejecutándose en el mismo o en distintos sistemas, unidos mediante
Los sockets de Unix. Dr. Roberto Gómez Cárdenas ITESM-CEM. Dr. Roberto Gomez C. Diapo. No.
Los sockets de Unix Emisor Receptor Dr. Roberto Gómez Cárdenas ITESM-CEM [email protected] http//homepage.cem.itesm.mx/rogomez Dr. Roberto Gomez C. Diapo. No. 1 La comunicación - Comunicación ocurre a través
SOCKETS en Linux. Lic. Leonardo de - Matteis. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 2011
Introducción al uso de SOCKETS en Linux Lic. Leonardo de - Matteis Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 2011 Interfaz de programación de aplicaciones NAPI
EJEMPLOS PROGRAMACIÓN SOCKET - JAVA
EJEMPLOS PROGRAMACIÓN SOCKET - JAVA 1.- Calcular el Cuadrado TCP En esta aplicación el cliente se conecta al servidor, para ello debe introducir la dirección IP del servidor y los parámetros sobre los
Programación con Sockets
Programación con Sockets INTRODUCCIÓN 1 Qué son los Sockets? Son un mecanismo de comunicación entre procesos: Dentro de una misma máquina. Distribuidos en diferentes máquinas. Que pueden ser identificados
INTRODUCCIÓN A LA PROGRAMACIÓN CON SOCKETS. Celeste Campo Carlos García Rubio
INTRODUCCIÓN A LA PROGRAMACIÓN CON SOCKETS Celeste Campo ([email protected]) Carlos García Rubio ([email protected]) PROGRAMACIÓN CON SOCKETS Pág. 1 ÍNDICE 1. Introducción. 2. API de sockets: Llamadas al
Comunicación entre procesos: sockets udp. Jorge Iván Meza Martínez
Comunicación entre procesos: sockets udp Jorge Iván Meza Martínez [email protected] Especialización en Gestión de Redes de Datos Universidad Nacional de Colombia Sede Manizales 1/31 Contenidos Conceptos
Programación Básica de Sockets en Unix para Novatos
Tabla de contenidos BracaMan Introducción...3 Diferentes tipos de sockets en Internet...3 Estructuras...3 Conversiones....5 Direcciones IP...5 Funciónes Importantes...6 Algunas palabras sobre dns...14
Características de un lenguaje ideal para robótica
COMUNICACIÓN MEDIANTE SOCKETS Enrique Ortega Edrodoso Ingeniería Técnica de Informática de Gestión Introducción Los vehículos autoguiados comerciales disponibles en la actualidad tienen una serie de inconvenientes
Modem IBM Compatible. IBM Compatible. Ethernet IBM AS/400. Laser printer. Workstation. Mac II. El Interfaz. Socket. versión perliminar
IBM Compatible Modem IBM Compatible Ethernet IBM AS/400 Laser printer Workstation Mac II El Interfaz Socket versión perliminar ÍNDICE 1. INTRODUCCIÓN. 2. QUÉ ES UN SOCKET?. 2.1. Dominio de un socket. 2.2.
ARQUITECTURA DE REDES Laboratorio PRÁCTICA 2: MANUAL DE SOCKETS EN C. Grado en Ingeniería Informática Curso 2014/15
ARQUITECTURA DE REDES Laboratorio PRÁCTICA 2: MANUAL DE SOCKETS EN C Grado en Ingeniería Informática Curso 2014/15 ÍNDICE 1. INTRODUCCIÓN.. 3 1.1 La familia de protocolos TCP/IP. 3 1.2 Nivel de red (IP)..
Programación en red sobre TCP/IP Interface sockets
Programación en red sobre TCP/IP Interface sockets Teresa Monreal y Pablo Ibáñez Area de Arquitectura y Tecnología de Computadores Departamento de Informática e Ingeniería de Sistemas 1 Indice Introducción.
Tema II. Sockets. Desarrollo de Aplicaciones para Internet Curso Miguel Reboiro Jato
Tema II. Sockets Desarrollo de Aplicaciones para Internet Curso 12 13 Miguel Reboiro Jato Índice 1. Qué es un Socket? 2. Tipos de Socket 3. Sockets en Java 1. InetAddress y SocketAddress 2. Socket y ServerSocket
Programación C/S Básica
1 de 16 Programación C/S Básica Enrique Alba Torres Universidad de Málaga (UMA) 2 de 16 Los servicios Internet se ofertan como sistemas Cliente/Servidor Los protocolos de base suelen ser peer-to-peer (igual-a-igual)
Sockets (UDP) Tema 2.- Nivel de aplicación en Internet
Sockets (UDP) Tema 2.- Nivel de aplicación en Internet Dr. Daniel Morató es de Computadores Ingeniero Técnico en Informática de Gestión, 2º curso Sockets y UDP UDP: no hay conexión entre cliente y servidor»
Federico Peinado www.federicopeinado.es
Federico Peinado www.federicopeinado.es Depto. de Ingeniería del Software e Inteligencia Artificial disia.fdi.ucm.es Facultad de Informática www.fdi.ucm.es Universidad Complutense de Madrid www.ucm.es
Problemas de Redes de Computadores. Conjunto de problemas 1
Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1 Pregunta 1.1: Si configuro mi servidor Web para que no acepte conexiones desde la dirección IP 130.206.1.1,
1.- FUNDAMENTOS...2 2.- FUNCIONAMIENTO GENÉRICO...3 3.- JAVA SOCKETS... 4. 3.4.1.- Creación de Streams de Entrada...7
1.- FUNDAMENTOS...2 2.- FUNCIONAMIENTO GENÉRICO...3 3.- JAVA SOCKETS... 4 3.1.- INTRODUCCION... 4 3.2.- MODELO DE COMUNICACIONES CON JAVA...5 3.3.- APERTURA DE SOCKETS... 6 3.4.- CREACIÓN DE STREAMS...
UNIVERSIDADE DA CORUÑA Departamento de Tecnoloxías da Información e as Comunicacións LABORATORIO DE RC: TUTORIAL DE SOCKETS EN JAVA
UNIVERSIDADE DA CORUÑA Departamento de Tecnoloxías da Información e as Comunicacións LABORATORIO DE RC: TUTORIAL DE SOCKETS EN JAVA Índice 1. Presentación...3 2. Conceptos básicos...4 2.1. TCP...4 2.2.
SOCKET S. Alberto Castro Rojas
SOCKET S EL64E Alberto Castro Rojas 1 Interfaz de programación genérica Soporte de múltiples suites de protocolos de comunicación (familias) Representaciones de direcciones sin dependencias (endpoint)
