Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ingeniería Telemática
Programación Avanzada
Alumnos
Grupo: 2TV3
“Sockets”
Es muy común en este tipo de comunicación lanzar un proceso hijo, una vez
realizada la conexión, que se ocupe del intercambio de información con el proceso
cliente mientras el proceso padre servidor sigue aceptando conexiones. Para
eliminar esta característica se cerrará el descriptor del socket servidor con nombre
en cuanto realice una conexión con un proceso socket cliente. Todo socket viene
definido por 3 características fundamentales:
Dominio de un Socket
Indica el formato de las direcciones que podrán tomar los sockets y los protocolos
que soportarán dichos sockets. La estructura genérica es:
struct sockaddr {
u__short sa__family; /* familia */
char sa__data[14]; /* dirección */
};
I. AF_UNIX: Sockets internos de UNIX (Sockets del sistema de archivos).
struct in__addr {
u__long s__addr;
};
struct sockaddr__in {
short sin_family; /* en este caso AF_INET */
u__short sin_port; /* numero del puerto */
struct in__addr sin__addr; /* direcc Internet */
char sin_zero[8]; /* campo de 8 ceros */ };
III. AF_ISO: Protocolos estándar ISO.
IV. AF_NS: Protocolos de redes Xerox
Protocolo
Se usa donde el mecanismo de transporte permite más de un protocolo a ser
usado. En las redes de UNIX y en los sockets de sistema de archivos no
necesitamos seleccionar otro protocolo diferente al default.
Tipos
SOCK_STREAM: Para flujo
Son implementados en el dominio AF_INET por conexiones TCP/IP.
Son el tipo usual en el dominio AF_UNIX.
Filosofía cliente-servidor
CLIENTE: Es un ordenador que solicita al servidor que ejecute algún tipo de tarea.
SERVIDOR: Es un ordenador que está conectado a una red y que ofrece sus
servicios a cualquier nodo que los solicite. El servidor puede atender a varios
clientes al mismo tiempo.
Resumiendo, esta filosofía describe un sistema en el que un equipo llamado
cliente solicita a otro equipo llamado servidor que ejecute una tarea específica.
Cliente:
Es quien inicia solicitudes o peticiones, tienen por tanto un papel activo en
la comunicación (dispositivo maestro o amo).
Espera y recibe las respuestas del servidor.
Por lo general, puede conectarse a varios servidores a la vez.
Normalmente interactúa directamente con los usuarios finales mediante una
interfaz gráfica de usuario.
int socket ( int dominio, int tipo, int protocolo)
Crea un socket sin nombre de un dominio, tipo y protocolo específico
• dominio : AF_INET, AF_UNIX
• tipo : SOCK__DGRAM, SOCK__STREAM
• protocolo : 0 ( protocolo por defecto )
int connect ( int dfCliente, struct sockaddr* direccServer, intlongDirecc)
Intenta conectar con un socket servidor cuya dirección se encuentra incluida en la
estructura apuntada por direccServer. El descriptor dfCliente se utilizará para
comunicar con el socket servidor. El tipo de estructura dependerá del dominio en
que nos encontremos.
Servidor:
Al iniciarse esperan a que lleguen las solicitudes de los clientes,
desempeñan entonces un papel pasivo en la comunicación (dispositivo
esclavo).
Tras la recepción de una solicitud, la procesan y luego envían la respuesta
al cliente.
Por lo general, acepta las conexiones de un gran número de clientes (en
ciertos casos el número máximo de peticiones puede estar limitado).
int socket ( int dominio, int tipo, int protocolo):
• crea un socket sin nombre de un dominio, tipo y protocolo específico
• dominio : AF_INET, AF_UNIX
• tipo : SOCK__DGRAM, SOCK__STREAM
• protocolo : 0 ( protocolo por defecto )
int bind ( int dfServer, struct sockaddr* direccServer, int longDirecc)
Nombra un socket: asocia el socket no nombrado de descriptor dfServer con la
dirección del socket almacenado en direccServer. La dirección depende de si
estamos en un dominio AF_UNIX
o AF_INET.
int listen ( int dfServer, int longCola)
Especifica el máximo número de peticiones de conexión pendientes.
int accept ( int dfServer, struct sockaddr* direccCliente, int* longDirecc)
Escucha al socket nombrado “servidor dfServer” y espera hasta que se reciba
la petición de la conexión de un cliente.Al ocurrir esta incidencia, crea un
socket sin nombre con las mismas características que el socket servidor
original, lo conecta al socket cliente y devuelve un descriptor de fichero que
puede ser utilizado para la comunicación con el cliente.
Avisar al sistema de que comience a atender dicha conexión de red.
Se consigue mediante la función listen(). A partir de este momento el sistema
operativo anota r á la conexión de cualquier cliente para pasárnosla cuando se
lo pidamos.
Si llegan clientes más rápido de lo que somos capaces de atenderlos, el
sistema operativo hace una "cola" con ellos y nos los ir á pasando según
vayamos pidiéndolo.
Pedir y aceptar las conexiones de clientes al sistema operativo.
Para ello hacemos una llamada a la función accept(). Esta función le indica al
sistema operativo que nos d é al siguiente cliente de la cola. Si no hay clientes
se quedar á bloqueada hasta que algún cliente se conecte.
En la arquitectura C/S sus características generales son:
El Cliente y el Servidor pueden actuar como una sola entidad y también
pueden actuar como entidades separadas, realizando actividades o tareas
independientes.
Las funciones de Cliente y Servidor pueden estar en plataformas
separadas, o en la misma plataforma.
Cada plataforma puede ser escalable independientemente. Los cambios
realizados en las plataformas de los Clientes o de los Servidores, ya sean
por actualización o por reemplazo tecnológico, se realizan de una manera
transparente para el usuario final.
La interrelación entre el hardware y el software están basados en una
infraestructura poderosa, de tal forma que el acceso a los recursos de la red
no muestra la complejidad de los diferentes tipos de formatos de datos y de
los protocolos.
Su representación típica es un centro de trabajo (PC), en donde el usuario
dispone de sus propias aplicaciones de oficina y sus propias bases de
datos, sin dependencia directa del sistema central de información de la
organización.
Señales
Algunas señales:
SIGALRM: generada cuando el timer asociado a la función alarm expira.
También cuando el timer de intervalo es configurado (setitimer)
SIGCHLD: Cuando un proceso termina o para, el proceso envía esta señal
a su padre. Por defecto esta señal es ignorada. Normalmente el proceso
padre invoca la función wait para obtener el estatus de término del proceso
hijo. Se evita así la creación de procesos "zombies".
SIGCONT: es enviada para reanudar un proceso que ha sido parado
(suspendido) con SIGSTOP.
SIGINT: generada con DELETE o Control-C
SIGKILL: Permite terminar un proceso.
SIGTSTP: generada cuando presionamos Control-Z. Puede ser ignorada.
SIGSTOP: similar a SIGTSTP pero no puede ser ignorada o capturada.
SIGUSR1: Es una señal definida por el usuario para ser usada en
programas de aplicación.
SIGUSR2: Otra como la anterior.
Función signal
#include <signal.h>
void (*signal (int signo, void (*func) (int)))(int);
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
En nuevas versiones de sistema operativo también se puede usar
unsigned int ualarm(unsigned int microseconds);
int pause(void); /* retorna -1 con errno en EINTR */
El control del tiempo no es exacto por la incertidumbre del kernel, carga del
sistema, etc. La alarma se puede cancelar con seconds=0 en el argumento. El
valor retornado es lo que falta para que el reloj expire.
Ejemplos:
Bibliografías:
http://es.tldp.org/Universitarios/seminario-2-sockets.html
http://sopa.dis.ulpgc.es/ii-dso/leclinux/ipc/sockets/sockets.pdf
http://www.starlinux.net/staticpages/index.php?page=20020720164837437
http://profesores.elo.utfsm.cl/~agv/elo330/2s08/lectures/signals.html
http://sopa.dis.ulpgc.es/progsis/material-didactico-
teorico/tema4_1transporpagina.pdf