Está en la página 1de 19

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

DESARROLLO DE APLICACIONES DISTRIBUIDAS


PRCTICAS CURSO 2002-2003

SOCKETS en UNIX

1. Los SOCKETS en OSI/ISO


- Como ya conocis, el modelo OSI/ISO estructura los diferentes elementos que conforman una red de comunicacin en 7 niveles. Cada capa ofrece sus servicios a los componentes del nivel superior y a su vez usa los servicios de la capa inferior. - Es importante distinguir entre servicios y protocolos: Los servicios de cada capa vienen a ser una interfaz con sta, mientras que los protocolos definen las forma de las tramas de bits que se intercambian entre capas y el modo en que se efectuar la comunicacin.

1.1. Los 7 niveles OSI:

NIVEL 1: Capa FSICA: Se ocupa de la transmisin de bits a lo largo de un canal de comunicacin. NIVEL 2: Capa de ENLACE: Transforma el medio de transmisin (por naturaleza ruidoso) en una lnea sin errores. NIVEL 3: Capa de RED: Obtiene paquetes del origen y los encamina por la red hasta su destino. NIVEL 4: Capa de TRANSPORTE: Acepta los datos de la capa de sesin, los divide en unidades ms pequeas y los pasa a la capa de red asegurndose de que llegan a su destino.

-1-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

NIVEL 5: Capa de SESIN: Permite que los usuarios de distintas mquinas puedan abrir sesiones en mquinas remotas. Por ejemplo, conectarse a un sistema remoto con TELNET o transportar ficheros de una mquina a otra con FTP. NIVEL 6: Capa de PRESENTACIN: Se encarga de unificar la sintaxis y la semntica de la informacin que se transmite. Por ejemplo, resuelve los problemas que puedan surgir de codificaciones de caracteres distintas como ASCII y EBCDIC, o distinta representacin de los coma flotante, etc. NIVEL 7: Capa de APLICACIN: Ofrece sus servicios al usuario resolviendo los problemas de ms alto nivel, como por ejemplo la compatibilidad entre terminales, etc. Un ejemplo es el sistema de ventanas X-WINDOWS.
MQUINA A APLICACIN MQUINA B APLICACIN

PRESENTACIN

PRESENTACIN

SESIN

SESIN

TRANSPORTE

TRANSPORTE

RED

RED

ENLACE

ENLACE

FSICA

FSICA

- Haciendo una similitud con una empresa de transportes, la capa de aplicacin sera como el recepcionista que le entrega un formulario al cliente para que ste defina sus necesidades de transporte. La capa de presentacin sera por ejemplo el traductor que traduce los datos de un idioma a otro, si por ejemplo se quiere enviar un paquete desde
-2-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

Barcelona a Londres. La capa de sesin sera la persona que se encarga de establecer el contacto con las empresas necesarias para que se produzca el envo y recepcin en el destino, es decir, establece el sistema: el paquete lo transportar la empresa concertada A hasta el destino donde ser distribuido por otra empresa concertada B, etc.... La capa de transporte sera como el embalador del paquete que le pone el sello de origen Barcelona y destino Londres, y que se encargar de recibir la confirmacin de que el paquete ha llegado bien. La capa de red, sera el encargado de establecer la ruta por las distintas ciudades. La capa de enlace sera el camionero que se encarga del controlar que el objeto llegue sin errores (accidentes) a su destino. Por ltimo la capa fsica la formaran el camin y la carretera que son los que permiten fsicamente el movimiento del objeto. - Los SOCKETS de UNIX se sitan en la capa de TRANSPORTE ofreciendo un servicio a la capa superior. El uso de Sockets libera al programador de preocuparse por el canal fsico (nivel fsico), los errores de la transmisin (nivel enlace), los nodos de la red por donde deben encaminarse las tramas de bits (nivel red), y de la formacin de paquetes de informacin desde el origen al destino (nivel transporte).

2. Familias y tipos de conexin.


- Para poder trabajar con sockets hay que conocer algunos aspectos que pertenecen a las capas inferiores. Estos aspectos son la familia o dominio de la conexin y el tipo de conexin. - La familia (o dominio) agrupa los sockets que comparten una serie de caractersticas comunes como convenios para formar direcciones de red o para nombrar los objetos de la red. Las familias ms comunes en los sistemas UNIX son: a) Familia AF_UNIX: Que usa protocolos internos de Unix. Se suele emplear para comunicar procesos que se ejecutan en una misma mquina ya que no realiza accesos a la red. b) Familia AF_INET: Que usa protocolos de Internet, como el TCP (Transmisin Control Protocol) orientado a conexin o UDP (User Datagram Protocol) no orientado a conexin. Esta familia de sockets es la que usa para comunicar procesos entre mquinas distintas a travs de la red. c) Familia AF_CCITT: Que usa la Norma X.25 de CCITT. d) Familia AF_NS: Que usa protocolos NS de XEROX. e) Familia AF_SNA: Protocolos IBM SNA.

-3-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

f) Familia AF_DECnet. g) Familia AF_APPLETALK. - El tipo de conexin se refiere al tipo de circuito que se establece entre los dos procesos que se van a comunicar. Hay 2 tipos de circuitos: a) VIRTUAL (orientado a conexin): Mediante la bsqueda de enlaces libres, se establece un circuito virtual entre los dos procesos que se van a comunicar de tal forma que esta conexin ya es permanente hasta el final de la comunicacin. Una vez se establece el circuito, los datos se pueden enviar secuencialmente sin preocuparse del circuito por donde pasen (conocido como STREAM o corriente de datos). El tipo de socket que usa el circuito virtual se define como SOCK_STREAM. En la familia AF_INET usan el protocolo TCP. b) DATAGRAMA (no orientado a conexin): Los datagramas no trabajan con circuitos permanentes. La transmisin se realiza a nivel de paquetes de tal forma que cada paquete puede seguir una ruta distinta y por lo tanto no garantiza la recepcin secuencial de la informacin. El uso de datagramas mejora las prestaciones del sistema ya que la red est menos tiempo ocupada aunque obliga al programador a establecer algn mecanismo para garantizar la recepcin secuencial de la informacin. El tipo de socket que usa datagramas se define como SOCK_DGRAM. En la familia AF_UNIX usan el protocolo UDP. Otros tipos de sockets son los SOCK_RAW que usan el protocolo IP de mas bajo nivel. Estos sockets solo estn disponibles para el Superusuario.

3. Direcciones de la red.
- La direccin de red distingue inequvocamente a cada nodo de la red. - Para hacer referencia a los nodos origen y destino de la conexin, algunas llamadas a los sockets necesitan usar un puntero a una estructura de direccin de socket. Esta estructura est definida en el fichero de cabecera <sys/socket.h>: struct sockaddr { u_short sa_family; char sa_data[14]; }; /* familia de sockets: AF_xxxx */ /* 14 bits con la direccin.*/ /* Su codificacin depende de la familia */

-4-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

- Esta estructura general depende de la familia de sockets que se est usando. Sin embargo, algunas familias han definido su propia estructura para las direcciones de red. As para la familia AF_INET (con protocolos de Internet) se define en el fichero <netinet/in.h>: struct in_addr{ u_long s_addr; }; struct sockaddr_in { short sin_family; u_short sin_port; in_addr sin_addr; char sin_zero[8]; }; /* 32 bits con la identificacin de la red y el host (en binario) */

/*en este caso, AF_INET */ /* 16 bits con el nmero de puerto */ /* id. red y host */ /* 8 bytes sin usar */

- La estructura equivalente en la familia AF_UNIX emplea direcciones con la forma definida en <sys/un.h>: struct sockaddr_un{ short sun_family; /* AF_UNIX */ char sun_path[108]; /* Path name */ }; - La direccin de un proceso en la familia UNIX, corresponde en realidad a un nombre de fichero (path) puesto que son procesos que se ejecutan en la misma mquina. - El nmero de puerto se usa para asociar el socket al proceso que se est ejecutando. Si en una misma mquina hay distintos sockets abiertos cada uno de ellos deber llevar un nmero de puerto distinto, puesto que todos llevarn la misma direccin de red. - El nmero de puerto puede tomar valores entre 1024 y 65535. El sistema proporciona automticamente nmeros de puerto que estn libres entre 1024 y 5000 mediante ciertas funciones. Del nmero 1 al 1024 estn reservados al sistema y no pueden ser usados por aplicaciones de usuario. - La funcin int rresvport (int * port) reserva un puerto entre 1024 y 5000. - Si el nmero de puerto contiene un 0 antes de efectuar la operacin BIND, el sistema tambin le gestionar un nmero de forma automtica.

-5-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

3.1. Funciones para la conversin de direcciones.

# include <sys/socket.h> # include <netinet/in.h> # include <arpa/inet.h> unsigned long inet_addr (const char * cp) Convierte al formato decimal estndar del usuario apuntado por cp al formato binario definido en la estructura struct in_addr. struct in_addr direccion; ................................. direccion.s_addr = inet_addr(128.12.10.00) Las direcciones en internet se dan al usuario en formato decimal formado por nmeros del 0 al 255 separados por puntos, que identifican la red o subred y el nmero de host. char * inet_ntoa ( struct in_addr in ) Hace la operacin contraria. Devuelve la cadena en decimal dada una estructura in_addr.
3.2. Funciones para la conversin de formatos numricos. Al comunicar entre dos mquinas distintas, puede ser que cada una de ellas use un formato de almacenamiento numrico distinto:

a) big-endian

direccin N : byte ms significativo direccin N+1 : byte menos significativo : byte menos significativo direccin N+1 : byte ms significativo

b) little-endian direccin N

Por su parte, los protocolos TCP (orientados a conexin) y UDP (no orientados a conexin) usan big-endian. As se definen las siguientes funciones que realizan las conversiones: # include <sys/types.h> # include <netinet/in.h> unsigned long htonl ( unsigned long hostlong ) Convierte un long del formato de la mquina al de la red. unsigned short htons ( unsigned short hostshort )

-6-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

Convierte un short del formato de la mquina al de la red. unsigned long ntohl ( unsigned long netlong ) Convierte un long del formato de la red al de la mquina. unsigned short ntohs ( unsigned short netshort ) Convierte un short del formato de la red al de la mquina. Ejemplo: struct sockaddr_in servidor_addr; ........................................ servidor_addr.sin_port = htons(7000);

4. Llamadas para el manejo de Sockets


4.1. Socket - Apertura de un punto terminal en un canal.

#include <sys/types.h> #include <sys/socket.h> int socket (int af, int type, int protocol); Socket crea un punto terminal para conectarse a un canal bidireccional, devolviendo un descriptor para ese canal. af - Es la familia: AF_UNIX, AF_INET, AF_CCITT, AF_NS, ... type - El tipo de conexin: SOCK_DGRAM (para datagramas) SOCK_STREAM (para virtual),

protocol - Es el protocolo particular que se desea usar. Normalmente cada tipo de socket slo tiene un protocolo, pero si hay ms de uno se puede especificar. Si no, se pone un 0. Si todo funciona bien, socket devuelve un descriptor de fichero. En caso contrario devuelve -1, quedando codificado el error en la variable global errno. 4.2. Bind. Nombre de un socket - Bind une un socket a una direccin de red determinada. Su declaracin es: #include <sys/socket.h>
-7-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

#include <sys/un.h> /* para la familia AF_UNIX */ #include <netinet/in.h> /* para la familia AF_INET */ int bind(int sfd, const void *addr,int addrlen) - Bind hace que el socket con descriptor sfd se una a la direccin de socket que especifica la estructura apuntada por addr y de longitud addrlen. La estructura a la que apunta addr deber ser struct sockaddr_un en el caso de la familia AF_UNIX, y ser struct sockaddr_in en el caso de la familia AF_INET. - Si la llamada funciona correctamente, bind devuelve 0, en caso contrario -1. 4.3. Listen. Disponibilidad para recibir peticiones de servicio. - En los sockets orientados a conexin, los programas servidores usan listen para indicar que el programa est preparado para recibir peticiones de conexin. #include <sys/socket.h> int listen (int sfd, int backlog) - Listen habilita una cola asociada al socket descrito por sfd para alojar las peticiones de conexin que le realicen otros programas. La longitud de esa cola se especifica en backlog. - Listen slo tiene sentido en sockets del tipo SOCK_STREAM. - Si listen funciona correctamente devuelve 0, y en caso de error -1. 4.4. Connect. Peticin de conexin. - Es la llamada que hace un proceso cliente para empezar a comunicar a travs de un socket. #include <sys/socket.h> #include <sys/un.h> /* para la familia AF_UNIX */ #include <sys/in.h> /* para la familia AF_INET */ int connect (int sfd,const void *addr,int addrlen) - sfd es el descriptor del socket.

-8-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

- addr un puntero a la estructura que contiene la direccin del socket remoto con el que se quiere conectar. Dicha estructura podr ser struct sockaddr_un o struct sockaddr_in segn la familia. - addrlen especifica el tamao de la estructura. - Si el socket es del tipo SOCK_DGRAM, connect especifica la direccin del socket remoto, pero no se conecta con l. - Si el socket es del tipo SOCK_STREAM, connect intenta una conexin entre el ordenador local y el remoto, quedando la llamada bloqueada hasta que se consigue la conexin o devolviendo un error si no se consigue (cuando est activo el modo de acceso no bloqueante O_NDELAY). - El modo de acceso al socket se puede modificar usando la funcin fcntl(). fcntl ( sfd, F_SETFL, O_NDELAY ) - La conexin correcta devuelve un 0. Se devuelve -1 en caso de error. 4.5. Accept. Aceptacin de conexin. - Los servidores que usan sockets orientados a conexin aceptan las demandas de servicio por medio de la llamada accept. #include <sys/socket.h> int accept(int sfd, void *addr, int *addrlen) - sfd es el descriptor de socket creado por la llamada socket y unido a una direccin con bind. - accept extrae la primera llamada de la cola que ha creado listen sobre el socket, y despus crea un nuevo socket con las mismas propiedades que sfd, reservndole un nuevo descriptor de fichero. - Si no hay peticiones para extraer de la cola, accept permanecer bloqueada a menos que est activo el control de acceso no bloqueante (O_NDELAY) en cuyo caso devolver un error. - addr debe apuntar a una estructura local de direccin de socket. La propia llamada accept rellenar esa estructura con la direccin del socket remoto que ha pedido la conexin.

-9-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

- addrlen debe ser un puntero para permitir que la llamada sobrescriba sobre l el tamao real de la direccin leda. - Si no se produce error, accept devolver el descriptor del nuevo socket creado que corresponder al socket remoto aceptado. En caso de error devuelve -1. 4.6. Read, readv, recv, recvfrom, recvmsg: Lectura o recepcin de mensajes de un socket. a) int read (int sfd, char* buf, unsigned nbyte)

- Read lee nbyte bytes del socket sfd y los almacena en el buffer apuntado por buf. Si no hay error, devuelve el nmero de bytes ledos. b) #include <sys/uio.h> ssize_t readv (int sfd, const struct iovec* iov, size_t iovcnt)

- Readv lee los datos del socket sfd y los distribuye entre los distintos buffers especificados por el array iov. El total de elementos de iov viene especificado por iovcnt: iov[0], .., iov[iovcnt-1] - La estructura iovec es la siguiente: struct iovec{ caddr_t iov_base; /* Direccin inicial del buffer */ int iov_len; /* Tamao en bytes del buffer */ }; - Readv lee hasta encontrar un fin de fichero o completar los buffers, devolviendo el nmero total de bytes ledos. c) #include <sys/socket.h> 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)

- sfd : descriptor del socket del que se lee. - buf : puntero al buffer donde se escriben los datos ledos. - len : nmero mximo de bytes que cabe en el buffer. - flags: es una combinacin de 2 bits: a) MSG_PEEK, que cuando vale 1 el dato ledo del socket no se vaca, es decir que se volver a leer.

-10-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

b) MSG_OOB, que cuando vale 1 lee slo los datos "urgentes" llamados mensajes fuera de banda. Por lo tanto, flags puede valer 0 (00), 1 (01), 2 (10) o 3 (11). Los sockets de la familia AF_UNIX no pueden tener activos ninguno de los dos anteriores. - Las 3 funciones devuelven el total de bytes ledos del socket. - A diferencia de read y readv que pueden leer igual de un descriptor de fichero que de un descriptor de socket, recv, recvfrom y recvmsg slo pueden leer de un descriptor de socket. - En los sockets SOCK_STREAM, las llamadas slo pueden usarse despus de haber establecido una conexin con CONNECT. En los SOCK_DGRAM no es necesario, si se hace, entonces se recibe siempre del mismo, si no, se recibe de cualquiera. - Recvfrom trabaja igual que recv, pero adems puede devolver la direccin del socket desde el que se enviaron los datos. Si from<>NULL, al llamar a la funcin deber apuntar a una estructura de direccin de socket, y al volver, la direccin del socket origen se recibir en la estructura apuntada, y fromlen debe contener el tamao de la direccin apuntada por from (al llamar a la funcin, la que tenga from, y al salir la que ha ledo realmente) - En los sockets SOCK_STREAM, recvfrom devuelve la misma informacin que recv ya que al establecer una conexin no devolver la direccin del socket origen. - En los sockets no orientados a conexin, el mensaje debe leerse en un solo bloque, ya que en otro caso queda truncado. - recvmsg permite que los datos ledos puedan distribuirse entre varios buffers. As msg es un array de cabeceras de mensaje con la siguiente estructura: struct msghdr { caddr_t msg_name; int msg_namelen; struct iovec* msg_iov; los datos int msg_iovlen; caddr_t msg_accrights; int msg_accrightslen; }; /* direccin de socket (opcional) */ /* tamao de la direccin de socket */ /* array de buffers sobre los que distribuir ledos */ /* num. de elementos del array msg_iov */ /* derechos de acceso */ /* tamao de msg_accrights */

-11-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

- msg_name y msg_namelen se usan en los sockets no conectados para conocer la direccin del socket origen o destino. - msg_iov es un array de buffers donde se distribuyen los datos leidos o por enviar. - msg_accrights recoge los derechos de acceso enviados opcionalmente con los mensajes en los sockets de la familia AF_UNIX. 4.7. Write, writev, send, sendto y sendmsg: escritura o envo de mensajes a un socket. - Son las funciones complementarias de read, readv, recv, recvfrom y recvmsg a) int write (int sfd, char* buf, unsigned nbyte)

- Write escribe nbyte bytes del buffer apuntado por buf en el socket sfd. Si no hay error, devuelve el nmero de bytes escritos realmente. b) #include <sys/uio.h> ssize_t writev (int sfd, const struct iovec* iov, size_t iovcnt)

- Writev escribe los datos en el socket sfd tomndolos de los distintos buffers especificados por el array iov. El total de elementos de iov viene especificado por iovcnt: - Writev devuelve el nmero total de bytes escritos. c) #include <sys/socket.h> 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 msg[], int flags)

- sfd : descriptor del socket donde se escribe. - buf : puntero al buffer de donde se leen los datos a escribir. - len : nmero de bytes en el buffer. - flags: puede valer 0 o MSG_OOB. (MSG_PEEK no tiene sentido aqu) - Las 3 funciones devuelven el total de bytes escritos en el socket. - A diferencia de write y writev que pueden escribir igual sobre un descriptor de fichero que sobre un descriptor de socket, send, sendto y sendmsg slo pueden escribir en un descriptor de socket, tal y como ocurra con recv, recvfrom y recvmsg.

-12-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

- En los sockets SOCK_STREAM, las llamadas slo pueden usarse despus de haber establecido una conexin con CONNECT. En los SOCK_DGRAM no es necesario. 4.8. Close. Cierre del canal. int close (int sfd) - La llamada a close cierra el socket en los dos sentidos de recepcin y envo. 4.9 Getsockname, getpeername. Obtencin de nombres de socket. - Estas llamadas tienen aplicacin en los SOCK_STREAM de la familia AF_INET. #Include <sys/socket.h> int getsockname(int sfd, void* addr, int addrlen) int getpeername(int sfd, void* addr, int addrlen) - Getsockname devuelve sobre la estructura apuntada por addr, la direccin del socket de descriptor sfd. - Getpeername devuelve sobre la estructura apuntada por addr, la direccin del socket que se encuentra conectado al socket de descriptor sfd. - addrlen siempre indica el tamao en bytes de la estructura apuntada por addr.

4.10. Gethostname. Nombre del nodo actual. - Se usa para determinar el nombre oficial que tiene un nodo en la red. #include <unistd.h> int gethostname (char* hostname, size_t size) - gethostname devuelve en el array apuntado por hostname el nombre oficial de host del ordenador que hace la llamada. Size contiene la longitud de ese array.

-13-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

4.11. Socketpair. Tuberas con sockets. - Crea un par de sockets que permiten la comunicacin bidireccional. #include <sys/socket.h> int socketpair(int family, int type, int protocol, int sockvec[2]) - family, type y protocol tiene el mismo significado que en la definicin de socket aunque, por ahora, slo admite la familia AF_UNIX. - sockvec es un vector que contendr los 2 descriptores de los sockets generados. 4.12. Shutdown. Cierre de socket en un sentido. - Cierra un socket en un nico sentido. int shutdown(int sfd, int how) - Si how=0 cierra recepcin de datos, 1 cierra envo de datos y 2 cierra ambos. 4.13. Gethostent, gethostbyname, gethostbyaddr, endhostent. Lectura del fichero /etc/hosts. sethostent,

- El fichero /etc/hosts contiene la informacin sobre todas las direcciones internet y los nombres de host de todos los nodos conectados a la red. Si nuestra red tiene un servidor de nombres (DNS), es ste el que resuelve la correspondencia entre direcciones IP y nombres de mquinas. Por ello, en el fichero /etc/hosts local, seguramente slo veremos las direcciones de la mquina en la que estemos trabajando, y la direccin del servidor DNS. Las siguientes funciones tienen como misin la lectura de dicho fichero si se trabaja sin servidor DNS. En el otro caso, el sistema redireccionar las llamadas al servidor DNS, y ste nos devolver los datos solicitados. #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> struct hostent* gethostent(); struct hostent* gethostbyname(char* name)

-14-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

struct hostent* gethostbyaddr(const char* addr, int len, int type) int sethostent(int stayopen) int endhostname() - La estructura hostent es la siguiente: struct hostent{ char* h_name; char** h_aliases; int h_addrtype; int h_lenght; char** h_addr_list; }; #define h_addr h_addrlist[0] anteriores */

/* Para compatibilizar con versiones

- Donde: h_name: nombre oficial del host. h_aliases: array con nombres alternativos del host h_addrtype: Siempre AF_INET. h_lenght: longitud en bytes de la estructura. h_addr_list: array de direcciones de red a las que responde el host. La lista se devuelve en formato de trabajo interno de la mquina (unsigned long), no como cadena de caracteres. - Gethostent: lee la siguiente lnea del fichero devolviendo la estructura anterior. Si es la primera, adems abre el fichero para lectura. Si es la ltima, devuelve NULL. - Sethostent abre el fichero para lectura y lo deja preparado para leer en la primera lnea. Si adems stayopen es distinto de 0, despus de cada llamada de gethostent no se cierra el fichero. - Endhostent cierra el fichero. - Gethostbyname lee secuencialmente el fichero hasta encontrar el nombre de host, o su alias, que coincide con name. - Gethostbyaddr hace lo propio con la direccin especificada en la zona de memoria apuntada por addr con longitud len. 4.14. Uname: Informacin del sistema.

-15-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

- Uname es una funcin no relacionada directamente con los sockets, aunque s til para establecer un sistema cliente-servidor. Uname proporciona al cliente informacin sobre el sistema en el que se est ejecutando el proceso servidor (y viceversa) #include <sys/utsname.h> int uname(struct utsname* uname); - Uname devuelve en la estructura apuntada por name la siguiente informacin: struct utsname{ char sysname[9]; /* nombre del sistema */ char nodename[9]; /* nombre del nodo */ char release[9]; /* edicin del sistema operativo */ char version[9]; /* versin del sistema operativo */ char machine[9]; /* tipo de mquina en la que se ejecuta el sistema */ };

-16-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

5. Modelo Cliente-Servidor - Servidor es un proceso que se ejecuta en cualquier nodo de una red y que gestiona el acceso a un determinado recurso. - Cliente es un proceso que se ejecuta en cualquier nodo de la red y que realiza peticiones de servicio al servidor. - Segn la forma de atender el servicio, se puede hacer la siguiente clasificacin de los servidores: a) Servidores interactivos: - Servidor que adems de recoger la peticin de servicio se encarga de atenderla l mismo. b) Servidores concurrentes: - Servidor que recoge cada una de las peticiones de los clientes y crea procesos para que se encarguen de atenderlas. Esto es especialmente til en los servidores que han de atender un gran volumen de peticiones.

-17-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

5.1. Esquema general del modelo cliente-servidor.


Proceso Servidor Abrir el canal de comunicacin Publicar en la red la direccin del canal de comunicacin Esperar una peticin de servicio fork proceso padre proceso hijo Atender al cliente Fn proceso hijo Esperar respuesta Fn proceso cliente Proceso Cliente Abrir el canal de comunicacin Conectar con la direccin del servidor Pedir servicio

-18-

Sistemas Informticos Distribuidos. Prctica 1. Los sockets en Unix.

SID96PR1.DOC 01/10/2002 19:09

5.2. Esquema Cliente-Servidor con sockets orientados a conexin:


Servidor
Abre canal

socket() bind() listen() accept()


Establece conexin

Publica direccin

Se dispone a recibir peticiones Acepta peticiones

Cliente socket() connect() write() read() close()


Cierra canal Abre canal

Pide conexin

read() write()

Pide servicio

Devuelve respuesta

5.3. Esquema Cliente-Servidor con sockets no orientados a conexin:


Servidor
Abre canal

Cliente socket() bind()


Pide servicio

socket() bind() revfrom()


Devuelve respuesta

Publica direccin

sendto() revfrom() shutdown()


Cierra canal

sendto()

Bibliografa:
UNIX. Programacin Avanzada. F.M.Marquez. ra-ma Comunicaciones en UNIX. Rifflet. McGraw Hill

-19-

También podría gustarte