Sockets
Definición de Socket Punto de comunicación entre procesos. Descriptor de socket.
Características de un socket <sys/socket.h> Dominio Tipo
Dominio de un socket Formato de direcciones y protocolos Dominio UNIX (AF_UNIX) : <sys/un.h> struct sockaddr_un{ short sun_family; char sun_data[108]; };
Dominio de un socket Dominio Internet (AF_INET) : struct in_addr{ u_long s_addr; }; struct sockaddr_in{ short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero[8];
Dominio de un socket Valores de la estructura: AF_INET IPPORT_TCP, IPPORT_TELNET; IPPORT_RESERVED. INADDR_ANY
Tipo de un socket Propiedades de comunicación Fiabilidad de la transmisión. Conservación del orden de los datos. No duplicación de datos. Comunicación en modo conectado. Conservación de los límites de los mensajes. Envío de mensajes <<urgentes>>.
Tipo de un socket Tipos disponibles SOCK_DGRAM. Propiedad 5. UDP. SOCK_STREAM. Propiedades 1-4. Propiedad 6. TCP. SOCK_RAW. Superusuario. IP.
Creación y Supresión de un Socket int socket (dominio, tipo, protocolo) int dominio; int tipo; int protocolo; Supresión: close
Enlazamiento socket-dirección Primitiva bind: int bind (sock, p_direccion, lg) int sock; struct sockaddr *p_direccion; int lg;
Enlazamiento socket-dirección El dominio Unix: ls, rm sockunix.c (hoja 5 de Sockets) El dominio Internet: gethostname, gethostbyname, INADDR_ANY getservbyname, IPPORT_RESERVED
Enlazamiento socket-dirección int getsockname (sock, p_adr, p_lg) int sock; struct sockaddr *p_adr; int *p_lg; crearsock.c (hoja 7 de Sockets)
Comunicación por datagramas Sockets tipo SOCK_DGRAM Poca fiabilidad Comunicación modo no conectado Posible <<pseudoconexión>> (dirección implícita)
Envío de mensajes int sendto (sock, msg, lg, opcion, p_dest, lgdest) int sock; char *msg; int lg; int opcion; struct sockaddr *p_dest; int lgdest;
Envío de mensajes int sendmsg (sock, msg, opcion) int sock; struct msghdr msg[]; int opcion;
Envío de mensajes struct msghdr { caddr_t msg_name; int msg_namelen; struct iovec *msg_iov; int msg_iovlen; caddr_t msg_accrights; int msg_accrightslen; };
Envío de mensajes struct iovec { caddr_t iov_base; int iov_len; }; msghdr en <sys/socket.h> iovec en <sys/uio.h>
Recepción de mensajes int recvfrom (sock, msg, lg, opcion, p_exp, p_lgexp) int sock; char *msg; int lg; int opcion; struct sockaddr *p_exp; int *p_lgex;
Recepción de mensajes int recvmsg (sock, msg, opcion) int sock; int sock; struct msghdr msg[]; int opcion;
Cliente/Servidor El Servidor: Creación y enlace al puerto de servicio de un socket. Desconexión del servidor de su terminal de lanzamiento o ejecución. Bucle infinito en el cual el servidor: Espera una petición. La trata. Pone la forma de respuesta. Envía la respuesta.
Cliente/Servidor El Cliente: Creación del socket local. Preparación de la dirección del servidor. Envío del mensaje. Espera del resultado. Explotación del resultado.
Ejemplo Cliente/Servidor Ejemplo Completo (hoja 11 de Sockets). Estructura hostent en netdb.h struct hostent{ char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; #define h_addr h_addr_list[0] };
Pseudoconexiones Primitiva connect: int connect (sock, p_adr, lgadr) int sock; struct sockaddr *p_adr; int lgadr;
Pseudoconexiones Primitiva socketpair: int socketpair (dominio, tipo, protocolo, p_sock) int dominio; int tipo; int protocolo; int *p_sock;
Pseudoconexiones Primitiva send: int send (sock, msg, lg, opcion) int sock; char *msg; int lg; int opcion;
Pseudoconexiones Primitiva recv: int recv (sock, msg, lg, opcion) int sock; char *msg; int lg; int opcion;
Comunicación modo conectado Fiabilidad Circuito virtual telnet, ftp, rlogin
socket/bind listen accept fork Creación y enlace del socket de escucha socket/bind Apertura del servicio listen Espera de demanda de conexión accept Servidor en modo conectado Creación de un subproceso fork PADRE HIJO Tratamiento de la demanda
Punto de vista del servidor int listen (sock, nb) int sock; int nb; int accept (sock, p_adr, p_lgadr) int sock; struct sockaddr *p_adr; int *p_lgadr;
Creación (y eventualmente enlace de un socket) socket/bind Construcción de la dirección del servidor Demanda de conexión connect Cliente en modo conectado Fallo Éxito Diálogo con el servidor
Punto de vista del cliente int connect (sock, p_adr, lgadr) int sock; struct sockaddr *p_adr; int lgadr;
Diálogo servidor/cliente La emisión: int write (sock, msg, lg) int sock; char *msg; int lg;
Diálogo servidor/cliente La emisión: int send (sock, msg, lg, opcion) int sock; char *msg; int lg; int opcion;
Diálogo servidor/cliente La recepción: int read (sock, msg, lg) int sock; char *msg; int lg;
Diálogo servidor/cliente La recepción: int recv (sock, msg, lg, opcion) int sock; char *msg; int lg; int opcion;
Diálogo servidor/cliente El corte de la conexión: int shutdown (desc, sens) int desc; int sens;