Comunicación entre procesos (BSD) CI-2400 Programación Avanzada en Sistemas de Tipo UNIX Prof. Braulio José Solano Rojas ECCI, UCR
Mecanismos IPC del sistema 4.3BSD La interfaz de comunicación entre procesos BSD va a posibilitar comunicar procesos que se estén ejecutando bajo el control de una misma máquina o bajo el control de máquinas distintas. Cuando los procesos estén bajo el control de máquinas distintas será necesario que entre en juego redes de conexión entre computadores.
Cliente/Servidor Proceso servidor Proceso cliente Abrir el canal de comunicación. Abrir el canal de comunicación. Comunicar a la red la dirección del canal. Conectar con la dirección del servidor. Esperar petición de servicio. Pedir servicio. fork() Esperar respuesta. Atender al cliente. Fin del proceso cliente. Fin del proceso hijo.
Llamadas para el manejo de sockets La interfaz de Berkeley se ha codificado para que sea muy similar a la del sistema de archivos. Por ello algunas de las llamadas para manejar archivos van a estar disponibles también para manejar sockets.
Apertura de un punto terminal Se utiliza socket para abrir un canal bidireccional de comunicaciones. int socket(int af, int type, int protocol);
Nombre de un socket La llamada bind se utiliza para unir un socket a una dirección de red determinada. int bind(int sfd, const void *addr, int addrlen);
Disponibilidad para recibir peticiones Cuando se abre un socket, el programa servidor indica que está disponible para recibir peticiones mediante la llamada listen. int listen(int sfd, int backlog);
Petición de conexión Para que un cliente pueda conectarse a un servidor debe utilizar la llamada connect. int connect(int sfd, const void *addr, int addrlen);
Aceptación de una conexión Los procesos servidores leerán las peticiones de servicio mediante la llama accept. int accept(int sfd, const void *addr, int *addrlen);
Lectura de mensajes Una vez que hay canal de comunicaciones entre los procesos servidor y cliente está correctamente iniciado. Las llamadas para leer son: size_t readv(int fildes, const struct iovec *iov, size_t iovcnt); int recv(int sfd, void *buf, int len, int flags); int recvfrom(int sfd, void *buf, int len, int flags, void *from, int fromlen); int recvmsg(int sfd, struct msghdr msg[], int flags);
Escritura de mensajes Las siguientes son las llamadas para escritura: ssize_t writev(int fildes, const struct iovec *iov, size_t iovcnt); int send(int sfd, void *buf, int len, int flags); int sendto(int sfd, void *buf, int len, int flags, void *to, int tolen); int sendmsg(int sfd, struct msghdr[], int flags);
Cierre del canal Cuando no se necesita más el canal simplemente se utiliza la llamada close.
Llamadas y funciones misceláneas Las llamadas vistas en las filminas anteriores dan la manipulación básica de los sockets. Otras llamadas amplían la biblioteca de funciones para facilitar la labor del programador.
Nombres de un socket Para averiguar el nombre de un socket orientado a la conexión se utilizan los siguientes llamados: int getsockname(int sfd, void *addr, int *addrlen); int getpeername(int sfd, void *addr, int addrlen);
Nombre del nodo actual Para determinar el nombre que tiene el nodo dentro de la red se puede utilizar: int gethostname(char *hostname, size_t size);
Tuberías a partir de sockets La llamada socketpair se utiliza para crear un par de sockets que van a estar conectados y que posibilitan, cada uno por separado, una comunicación bidireccional. int socketpair(int family, int type, int protocol, int sockvec[2]);
Cierre de un socket Aunque la llamada close puede utilizarse para cerrar un socket, existe una llamada que da más control. La llamada shutdown se utiliza para cerrar total o parcialmente un socket. int shutdown(int sfd, int how);
Lectura del archivo /etc/hosts En el archivo /etc/hosts se guarda información sobre los computadores de la red. struct hostent *gethostent(); struct hostent *gethostbyname(name); struct hostent *gethostbyaddr(const char *addr, int len, int type); int sethostname(int stay open); int endhostent();
Lectura y examen corto https://www.freebsd.org/doc/en/books/developer s-handbook/sockets-essential-functions.html
Gracias por su atención! Preguntas?