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 */
};
Pueden ser:
* Dominio AF_UNIX ( Address Family UNIX ):
El cliente y el servidor deben estar en la misma máquina. Debe incluirse el
fichero cabecera /usr/include/sys/un.h. La estructura de una dirección en este
dominio es:
struct sockaddr__un {
short sun__family; /* en este caso AF_UNIX */
char sun__data[108]; /* dirección */
};
* Dominio AF_INET ( Address Family INET ):
El cliente y el servidor pueden estar en cualquier máquina de la red Internet.
Deben incluirse los ficheros cabecera /usr/include/netinet/in.h,
/usr/include/arpa/inet.h, /usr/include/netdb.h. La estructura de una dirección en
este dominio es:
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 */
};
Estos dominios van a ser los utilizados en xshine. Pero existen otros como:
* Dominio AF_NS:
Servidor y cliente deben estar en una red XEROX.
* Dominio AF_CCITT:
Para protocolos CCITT, protocolos X25, ...
4.3.- FILOSOFIA CLIENTE-SERVIDOR: el Servidor.
Vamos a explicar el proceso de comunicación servidor-cliente en modo
conectado, modo utilizado por las aplicaciones estándar de Internet (telnet, ftp). El
servidor es el proceso que crea el socket no nombrado y acepta las conexiones a él.
El orden de las llamadas al sistema para la realización de esta función es:
1º) int socket ( int dominio, int tipo, int protocolo )
crea un socket sin nombre de un dominio, tipo y p
rotocolo específico
dominio : AF_INET, AF_UNIX
tipo : SOCK__DGRAM, SOCK__STREAM
protocolo : 0 ( protocolo por defecto )
2º) 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.
3º) int listen ( int dfServer, int longCola )
especifica el máximo número de peticiones de conexión pendientes.
4º) int accept ( int dfServer, struct sockaddr* direccCliente, int* longDireccCli)
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.
4.4.- El Cliente.
Es el proceso encargado de crear un socket sin nombre y posteriormente enlazarlo
con el socker servidor nombrado. O sea, es el proceso que demanda una conexión al
servidor. La secuencia de llamadas al sistema es:
1º) 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 )
2º) int connect ( int dfCliente, struct sockaddr* direccServer, int longDirecc )
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.
Una vez establecida la comunicación, los descriptores de ficheros serán utilizados
para almacenar la información a leer o escribir.
SERVIDOR . CLIENTE
descrServer = socket ( dominio,
SOCK_STREAM,PROTOCOLO)
descrClient = socket (dominio,
SOCK_STREAM,PROTOCOLO)
bind (descrServer,
PuntSockServer,longServer)