Boletín 7- Sockets. Departamento de Lenguajes y Sistemas Informáticos

Documentos relacionados
Diseño de aplicaciones distribuidas ÍNDICE

Mecanismos IPC: sockets

DESARROLLO DE APLICACIONES DISTRIBUIDAS. SOCKETS en UNIX

Qué es un socket? Dominios de comunicación. Tipos de sockets en el dominio AF_INET. Sockets Stream. Sockets Datagram. Sockets Raw

Estructuras y funciones de programación de sockets.

UNIVERSIDAD DE CANTABRIA DEPARTAMENTO DE INGENIERÍA DE COMUNICACIONES GRUPO DE INGENIERÍA TELEMÁTICA

Migrando aplicaciones a IPv6

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Estructuras y funciones de programación de sockets.

Ingeniería Técnica de Telecomunicación, esp. Telemática Universidad de Jaén

Clase de Sockets en lenguaje C. Prof. Ricardo González

Sockets (TCP) Tema 2.- Nivel de aplicación en Internet

ARQUITECTURA DE REDES Laboratorio PRÁCTICA 2: MANUAL DE SOCKETS EN C. Grado en Ingeniería Informática Curso 2014/15

Adaptación de aplicaciones a IPv6

Arquitecturas Cliente/Servidor

Sockets: funcionamiento y programación. Sockets tipo UNIX. MSc. Ivan A. Escobar

Introducción a la programación con sockets en C

Introducción de Sockets en C.

Sockets Básicos. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. Temas a tratar...

-> Todo socket viene definido por dos características fundamentales:

Sistemas Operativos Distribuidos

Sockets Básicos. Sockets Básicos

Características de un lenguaje ideal para robótica

Redes de Computadores Nivel de Aplicación: Programación con sockets I

Tema 2. Comunicación entre procesos

Sistema Cliente Servidor Con Sockets

Modem IBM Compatible. IBM Compatible. Ethernet IBM AS/400. Laser printer. Workstation. Mac II. El Interfaz. Socket. versión perliminar

sockets Flujo (SOCK_STREAM) Comunicación bidireccional Confiable (entrega garantizada) Información ordenada en el destino Datagrama (SOCK_DGRAM)

Sockets (UDP) Tema 2.- Nivel de aplicación en Internet

Programación en red sobre TCP/IP Interface sockets

Tema 4: Sockets: Un interfaz con TCP/IP

Administración de redes en GNU/Linux

Redes (IS20) Ingeniería Técnica en Informática de Sistemas - (2º Curso)

Programación de aplicaciones distribuidas usando sockets

Programación con sockets

Programación C/S Básica

SISTEMAS DE COMUNICACIONES DE DATOS

SOCKETS en Linux. Lic. Leonardo de - Matteis. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 2011

Programación de sockets

Versión 1.0, 26 de marzo de 2.000

CENTRO DE ESTUDIOS NOVA - Cartagena Laboratorio de Software de Comunicaciones TEMA 1 FUNDAMENTOS DE SOCKETS TCP Y UDP

Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1

PRÁCTICA 2: Cliente-servidor UDP

COMUNICACIÓN ENTRE PROCESOS SOCKETS

Introducción a Sockets en Linux

Guía Beej de Programación en Redes

Programación con Sockets

AMPLIACION DE SISTEMAS OPERATIVOS SOCKETS AIRAN GODOY HERNANDEZ JOSE MARIA RODRIGUEZ RODRIGUEZ 5º INGENIERIA EN INFORMATICA

Comunicación entre procesos mediante Sockets Preparado por Gabriel Astudillo Muñoz Escuela de Ingeniería Civil Informática Universidad de Valparaíso

Desarrollo de Aplicativos con winsockets

Redes de Computadores: Relación de problemas 1. Sockets

Problemas de Redes de Computadores. Conjunto de problemas 1

ARQUITECTURA DE REDES Laboratorio

Análisis Experimental de la Transmisión de Datos

Usando Internet Sockets Brian "Beej" Hall Copyright by Brian "Beej" Hall

Computación de Alta Performance Curso 2009 PROGRAMACIÓN PARALELA EN LENGUAJE C

Bibliografía [COM00] Internetworking with TCP/IP, vol. 3, Cap. 2 y del 7 al 15.

Mecanismo(s) de intercambio de información entre 2 ó más computadores conectados entre sí o a través de otros.

Tema 5 El Modelo Cliente-Servidor

TELEPROCESO Y SISTEMAS DISTRIBUIDOS

LABORATORIO DE GESTIÓN DE REDES APÉNDICE: MANUAL DE SOCKETS EN C

Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información Curso de Redes I CI-4815 Trimestre Septiembre Diciembre 2013

TimeOut RTT medido 1 5 seg. 2*5= ,7 3 TimeOut 3 TimeOut 3 0, ,35 5 0,44

Los sockets de Unix. Funcionamiento y programación Dr. Roberto Gómez Cárdenas DCC del ITESM-CEM

Arquitecturas cliente/servidor

SOCKET S. Alberto Castro Rojas

Nuestro 1er Aniversario

Sockets. Los sockets son un mecanismo de comunicación entre procesos que se utiliza en Internet.

Tema 5 Comunicación con sockets

07 << Acceso en exclusiva al recurso compartido >>

Capítulo 5. Programación de aplicaciones de red

Juan de Dios Murillo Morera Santiago Caamaño Polini INTRODUCCIÓN

Práctica 5: Implementación en C++ de sistemas cliente/servidor basados en comunicación


Nivel de Transporte en Internet

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Alumno: Grupo: Ejercicio 1. Responda a las siguientes preguntas cortas justificando brevemente su respuesta (3 puntos).

Contenido. Primera Parte: Sockets. Segunda Parte: Shellcodes

WSAEADDRNOTAVAIL (10049) Dirección solicitada no se puede asignar.

ARQUITECTURA DE REDES Laboratorio

Red LSUB. 4 de marzo de 2015 GSYC

Escaneo Básico de Puertos Utilizando Flags TCP Alejandro Hernández

IMPLEMENTACIÓN DE APLICACIONES DE SEGURIDAD CON OPENSSL

Redes (IS20) Ingeniería Técnica en Informática de Sistemas. CAPÍTULO 8: El nivel de transporte en Internet

Protocolo de Internet versión 6 Configuración y Desarrollo

Examen de Fundamentos de Redes de Computadores Junio 2005

Arquitectura de Redes y Servicios de Telecomunicación

ESCUELA POLITÉCNICA NACIONAL

Definiciones preliminares

Práctica 1: sockets en Python

Tema 4.1: - TRANSPORTE-

Sistemas Operativos. Contents. Ezequiel Postan. Docentes. Guido Macchi. Esteban Ruiz. Federico Bergero. Guillermo Grimgblat

Ficheros conceptos. Manejo de ficheros en C. Apertura del fichero Función fopen: nombre del fichero. Apertura del fichero Función fopen

Permutació 1 Examen Introducció a les Xarxes d Ordinadors

TIPOS DE DATOS BASICOS EN LENGUAJE C

Es la capa donde se encuentran las aplicaciones que interactúan con el usuario. Son la razón de ser de las redes de datos

Sistemas de Transportes de Datos (STD) Tema II: IP (Entrega 6) Grupo de Aplicaciones Telemáticas. Grupo de Aplicaciones Telemáticas

Programación con Sockets

CUESTIONARIO PARA EL PROTOCOLO TCP/IP PREGUNTAS

TEMA 3. CONCEPTOS FUNDAMENTALES DEL NIVEL DEL SISTEMA OPERATIVO. Definición y objetivos de un S.O

Transcripción:

Boletín 7- Sockets Departamento de Lenguajes y Sistemas Informáticos

Indice 1. Introducción. 2. Tipos de sockets. 3. socket() 4. bind() 5. listen() 6. accept() 7. connect() 8. send()/ ()/recv(). 9. Funciones de ordenación de bytes 10. Funciones de conversión de nombre y direcciones. Departamento de Lenguajes y Sistemas Informáticos 2

1.- Introducción. Los sockets son otro mecanismo de comunicación entre procesos en Unix System V. Según el tipo de conexión Sockets en modo stream Sockets en modo datagrama Sockets en modo raw Según el dominio del socket: Sockets UNIX Sockets Internet STREAM SOCKET TCP Departamento de Lenguajes y Sistemas Informáticos DATAGRAM SOCKET UDP IP NIVEL DE RED NIVEL FISICO RAW SOCKET 3

Pasos para realizar en cualquier conexión: 1.- Establecimiento de conexión. Este proceso será distinto para el cliente y para el servidor. 2.- Recepción/envío de datos. Aquí ya no habrá diferencias entre cliente y servidor. 3. Destrucción del canal. 3. Destrucción del canal. Cliente y servidor han de destruir el canal, terminando la comunicación y liberando los recursos del sistema utilizados.

DESCONEXIÓN ENVÍO/RECEPCIÓN DATOS CONEXIÓN Protocolo orientado a la conexión (sockets en modo stream) Servidor socket ( ) bind ( ) listen() accept() Proceso bloqueado que se conecta con el cliente Cliente socket ( ) connect() read()/recv() write()/send() Procesa petición write()/send() read()/recv() LA LECTURA Y ESCRITURA SOBRE LOS SOCKETS SE REALIZAN COMO SI FUERAN UN FICHERO close( ) close ( )

Pasos establecimiento conexión en SERVIDOR 1. Solicitar al sistema operativo un socket. Llamada al sistema socket(). 2. Asignar un nombre (en el caso de dominio UNIX) o un número de puerto (dominio Internet) al socket de escucha. Llamada al sistema bind(). 3. Determinar la longitud de la cola de espera y dejar listo el socket de escucha para escuchar solicitudes de conexión por parte de los clientes. Llamada al sistema listen(). 4. Aceptar conexiones de los procesos clientes. Llamada al sistema accept(). Servidor socket ( ) bind ( ) listen() accept() Proceso bloqueado hasta que se conecte con el cliente

Pasos establecimiento conexión en CLIENTE 1. Solicitar al sistema operativo un socket. Llamada al sistema socket(). 2. Conectar el socket con un socket del servidor. Llamada al sistema connect(), que utiliza el nombre (dominio UNIX) o el número de puerto (dominio Internet) para identificar al socket al que se desea conectar. Cliente socket ( ) connect()

3.- La llamada: socket() Primer paso para realizar una conexión. #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); Servido r socket ( ) bind ( ) listen() accept() Parámetros domain Indica la familia de direcciones que se quiere emplear. AF_UNIX, AF_INET type indica la semántica de la comunicación para el socket. SOCK_STREAM SOCK_DGRAM protocol Especifica el protocolo particular que se va a utilizar con el socket. Cuando protocol vale 0, la elecci on del protocolo se deja en manos del sistema. Devuelve int devolverá un descriptor de fichero. En caso contrario, devolverá un -1 y en la variable global errno colocará el código del error que se ha producido. http://www.linuxinfor.com/spanish/man2/socket.html

3.- La llamada: socket() Ejemplo: #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h>... s1 = socket ( AF_UNIX, SOCK_DGRAM, 0); s2 = socket ( AF_INET, SOCK_STREAM, 0); close(s1); Close(s2);

4.- La llamada: bind() Sirve para asociar un socket a una dirección. #include <sys/types.h> #include <sys/socket.h> int bind(int s, const struct sockaddr *name, int namelen); Servido r socket ( ) bind ( ) listen() accept() Parámetros s El descriptor del socket al que se quiere asociar la dirección name estructura de datos que sera distinta en función de si es un socket unix (struct sockaddr_un) o un socket internet (struct sockaddr_in). namelen Tamaño en bytes de la estructura anterior Devuelve int devolverá 0 si correcto o un -1 y en la variable global errno colocará el código del error que se ha producido. http://www.linuxinfor.com/spanish/man2/bind.html

4.- bind() en socket UNIX (AF_UNIX) struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[108]; /* path name */ }; sun_family Indicará la familia de direcciones. Y en este caso, tendrá siempre el valor AF_UNIX. sun_path La ruta de un archivo del sistema de ficheros, ya que cuando se une un socket AF_UNIX a una ruta, por ejemplo, /tmp/misocket, se crea un fichero. Si el fichero ya existiese, la llamada a bind devolvería un error.

4.- bind() en socket UNIX (AF_UNIX) Ejemplo: #include <sys/types.h> #include <sys/socket.h> #include<sys/un.h> #include <string.h>... struct sockaddr_un su; int s; s = socket ( AF_UNIX, SOCK_DGRAM, 0); su.sun_family = AF_UNIX; strcpy( su.sun_path, "/tmp/misockunix"); bind ( s, (struct sockaddr *) &su, sizeof(su));

4.- bind() en socket Internet (AF_INET) struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; char sin_zero[8]; }; struct in_addr { in_addr_t s_addr; /* Direc.IP 32 bits */ }; /* en Network Byte Order */ sin_family Indicará la familia de direcciones. Valor fijo AF_INET. sin_port El puerto tcp (0 65535). sin_addr Dirección internet de la máquina. sin_zero (No se usa)

4.- bind() en socket Internet (AF_INET) Ejemplo: #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <string.h>... struct sockaddr_in sin; int s; struct hostent *hp; char hostname[lon_hostname]; /* Obtenemos el nombre de la m aquina donde se ejecuta el c odigo */ gethostname(hostname, sizeof(hostname)); /* Obtenemos su direcci on IP, a partir del nombre */ hp = gethostbyname (hostname); if (hp == NULL) printf ("Error"); else{ s = socket ( AF_INET, SOCK_STREAM, 0); sin.sin_family = AF_INET; sin.sin_port = htons(8080); /* Asignamos puerto en Network byte order */ /* Obtenemos la dirección IP en Network byte order */ memmove (&sin.sin_addr, hp->h_addr, hp->h_length); /* Asociamos direcci on y puerto al socket de escucha */ bind ( s, (struct sockaddr *) &sin, sizeof(sin));... }

5.- La llamada: listen() Indica al sistema que el socket se va a ser un socket de escucha y dimensiona una cola para aceptar peticiones. #include <sys/types.h> #include <sys/socket.h> int listen(int s, int backlog); Servido r socket ( ) bind ( ) listen() accept() Parámetros s El descriptor del socket al que se quiere asociar la dirección backlog Indica la longitud de la cola asociada al descriptor del socket, o lo que es lo mismo, el n umero máximo de peticiones de conexión pendientes de aceptación. Devuelve int devolverá 0 si correcto o un -1 y en la variable global errno colocará el código del error que se ha producido. http://www.linuxinfor.com/spanish/man2/listen.html

6.- La llamada: accept() Indica al sistema que ya puede aceptar peticiones de clientes #include <sys/types.h> #include <sys/socket.h> int accept(int s, struct sockaddr *addr, int *addrlen); Servido r socket ( ) bind ( ) listen() accept() Parámetros s El descriptor del socket al que se quiere asociar la dirección addr Este es un parámetro de salida, y se utiliza para devolver la dirección de cliente, una vez que cliente y servidor están conectados. addrlen longitud de addr. Entrada/Salida. Devuelve int devolverá devuelve el descriptor del socket conectado o un -1 y en la variable global errno colocará el código del error que se ha producido. http://www.linuxinfor.com/spanish/man2/accept.html

Cuando el servidor termina de servir a un cliente, debe cerrar el socket conectado. 6.- La llamada: accept(). Funcionamiento #include <sys/types.h> #include <sys/socket.h> int accept(int s, struct sockaddr *addr, int *addrlen); Esta función coge la primera petición de conexión de la cola y crea otro socket con las mismas propiedades que el socket de escucha, el cual se conoce como socket conectado. Si no hubiera ninguna petición en la cola, y el socket no tiene activo el modo no bloqueante (O_NDELAY), esta llamada bloquea al proceso que la llama hasta que llegue una petición. A lo largo de la vida de un proceso servidor: Solamente se creará un socket de escucha, Sin embargo, se creará un socket conectado por cada conexión de cliente que se acepte.

6.- La llamada: accept() Ejemplo: #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h>... int se; int sc; int longaddr; struct sockaddr_in si; longaddr = sizeof(si); sc = accept (se, (struct sockaddr *)&si, &longaddr); if (sc == -1) { /* Error aceptando conexi on */ }

6.- La llamada: connect() Establece una conexión con el servidor #include <sys/types.h> #include <sys/socket.h> int connect(int s, const struct sockaddr *name, int len); Cliente socket ( ) connect( ) Parámetros s El descriptor del socket al que se quiere asociar la dirección name estructura de datos que sera distinta en función de si es un socket unix (struct sockaddr_un) o un socket internet (struct sockaddr_in). namelen Tamaño en bytes de la estructura anterior Devuelve int devolverá 0 en caso de OK y -1 en caso de error http://www.linuxinfor.com/spanish/man2/connect.html

6.- connect(): funcionamiento. Establece una conexión con el servidor #include <sys/types.h> #include <sys/socket.h> int connect(int s, const struct sockaddr *name, int len); Cliente socket ( ) connect( ) Si el socket es de tipo SOCK_DGRAM, connect especifica la dirección del socket remoto al que se le van a enviar los mensajes, pero no se conecta con él. La llamada devuelve el control inmediatamente. Además a través del socket solamente se podrán recibir mensajes procedentes de la dirección especificada en name. Si el socket es de tipo SOCK_STREAM, connect intenta conectar con el ordenador remoto para realizar una conexión cliente-servidor. La llamada se bloquea hasta que la conexión se completa. Si la conexión no se puede realizar inmediatamente, pero el socket tiene activo el modo de acceso O_NDELAY, la llamada a connect devuelve el control indicando que se ha producido un error de conexión. http://www.linuxinfor.com/spanish/man2/connect.html

7.- Envio y recepción en modo stream: send()/recv() Una vez que cliente y servidor están conectados, se tiene un canal de comunicación bidireccional y simétrico. Hay 3 formas de enviar y recibir información: 1) Mediante llamadas al sistema específicas de sockets, utilizando send() y recv(). 2) Utilizando las llamadas read() y write() que se vieron en el boletín de ficheros. 3) Asociándole un buffer al descriptor del socket, con la función fdopen(), vista en el boletín de ficheros, y trabajar así a alto nivel (con un puntero a FILE) y utilizar las funciones de stdio: fprintf, fgets, fgetc, fputc, http://www.linuxinfor.com/spanish/man2/connect.html

7.- Envio y recepción en modo stream: send()/recv() #include <sys/types.h> #include <sys/socket.h> ssize_t recv(int s, void *buf, size_t len, int flags); ssize_t send(int s, const void *buf, size_t len, int flags); Parámetros s El descriptor del socket al que se quiere asociar la dirección buff Es un puntero al inicio del bloque a enviar, en el caso de send, o al inicio del bloque donde se colocará la información leída, en el caso de recv. len bytes a enviar (send) o bytes disponibles para recibir (recv). flag 0 o una serie de constantes definidas en el sistema. Devuelve int devolverá el numero de bytes leidos/recibidos o -1 en caso de error. http://www.linuxinfor.com/spanish/man2/send.html http://www.linuxinfor.com/spanish/man2/recv.html

7.- send()/recv(): Funcionamiento. #include <sys/types.h> #include <sys/socket.h> ssize_t recv(int s, void *buf, size_t len, int flags); ssize_t send(int s, const void *buf, size_t len, int flags); recv(). Si el número de bytes a leer fuese mayor que el tamaño de buf, entonces habría que hacer más invocaciones a recv para leer toda la información que haya disponible. recv() y send() son llamadas bloqueantes. recv(), si se hace una llamada al sistema y no hay datos disponibles para leer, el proceso que hizo la llamada quedará suspendido hasta que haya datos disponibles. send(), el proceso que realiza la llamada puede quedar bloqueado en el caso en el que el sistema tenga sus buffers lleno y no pueda almacenar temporalmente los datos a enviar.

8.- La llamada: close() Cierra las conexiones. Es la misma llamada que se usa para ficheros #include <sys/file.h> int close(int s); Parámetros s El descriptor del socket al que se quiere asociar la dirección Devuelve int devolverá 0 si OK y -1 en caso de error http://www.linuxinfor.com/spanish/man2/close.html

9.- Funciones de ordenación de bytes int= 110 00 6E 00 6E 6E 00 NOTACIÓN: LITTLE ENDIAN (EL byte menos significativo en la direcciones más bajas) NOTACIÓN: BIG ENDIAN (EL byte menos significativo en la direcciones más altas) HOST BYTE ORDER NETWORK BYTE ORDER #include <netinet/in.h> unsigned short htons(unsigned short); unsigned long htonl(unsigned long); unsigned short ntohs(unsigned short); unsigned long ntohl(unsigned long); htons y htonl convierten de host byte order a network byte order. La primera convierte un entero corto, y la segunda un entero largo. ntohs y ntohl convierten de network byte order a host byte order. La primera convierte un entero corto, y la segunda un entero largo.

10.- Funciones conversión de nombres y direcciones OBTENCIÓN DE LA DIRECCIÓN DE UNA MÁQUINA: gethostbyname() #include <netdb.h> struct hostent *gethostbyname(const char *name); Devuelve una estructura que contendrá todas las direcciones IP para esa máquina struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses from name server */ #define h_addr h_addr_list[0] /* address, forcompatiblity */ }; h_name murillo.eii.us.es h_aliases h_addrtype NULL alias1 alias2 struct in_addr() 150.214.90.80 h_length h_addr_list NULL struct in_addr() 150.214.90.10

10.- Funciones conversión de nombres y direcciones CONVERSIÓN DE FORMATO DE DIRECCIONES IP: inet_addr() y inet_ntoa() #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> in_addr_t inet_addr(const char *cp); char *inet_ntoa(const struct in_addr in); char* inet_addr() struct in_addr() 150.214.90.80 010110101001001000101 struct in_addr() 010110101001001000101 inet_ntoa() char* 150.214.90.80

10.- Funciones conversión de nombres y direcciones OBTENCIÓN DEL NOMBRE DEL HOST: gethostname() #include <unistd.h> int gethostname(char *name, int namelen); char maquina[20]; struct hostent *hp; gethostname(maquina,sizeof(maquina)); hp = gethostbyname(maquina); printf( Nombre de host %s,hp->h_name); printf( Dirección IP %s, inet_ntoa(*((struct in_addr *) hp->h_addr));