Upload
aina-casas
View
218
Download
0
Embed Size (px)
Citation preview
Sockets
Definición de Socket
Punto de comunicación entre procesos.Punto de comunicación entre procesos.
Descriptor de socket.Descriptor de socket.
Características de un socket
<sys/socket.h><sys/socket.h>
Dominio Dominio
TipoTipo
Dominio de un socket
Formato de direcciones y protocolos Formato de direcciones y protocolos Dominio UNIXDominio UNIX (AF_UNIX) (AF_UNIX) ::
<sys/un.h><sys/un.h>
struct sockaddr_un{struct sockaddr_un{
shortshort sun_family;sun_family;
charchar sun_data[108];sun_data[108];
};};
Dominio de un socket
Dominio InternetDominio Internet (AF_INET) : (AF_INET) :struct in_addr{struct in_addr{
u_long u_long s_addr;s_addr;
};};
struct sockaddr_in{struct sockaddr_in{
shortshort sin_family; sin_family;
u_shortu_short sin_port; sin_port;
struct in_addr sin_addr;struct in_addr sin_addr;
charchar sin_zero[8]; sin_zero[8];
};};
Dominio de un socket
Valores de la estructura:Valores de la estructura:
1.1. AF_INETAF_INET
2.2. IPPORT_TCP,IPPORT_TCP, IPPORT_TELNET;IPPORT_TELNET; IPPORT_RESERVEDIPPORT_RESERVED..
3.3. INADDR_ANYINADDR_ANY
Tipo de un socket
Propiedades de comunicaciónPropiedades de comunicación
1.1. Fiabilidad de la transmisión. Fiabilidad de la transmisión.
2.2. Conservación del orden de los datos. Conservación del orden de los datos.
3.3. No duplicación de datos. No duplicación de datos.
4.4. Comunicación en modo conectado. Comunicación en modo conectado.
5.5. Conservación de los límites de los Conservación de los límites de los mensajes. mensajes.
6.6. Envío de mensajes <<urgentes>>. Envío de mensajes <<urgentes>>.
Tipo de un socket
Tipos disponiblesTipos disponibles• SOCK_DGRAMSOCK_DGRAM. Propiedad 5. UDP.. Propiedad 5. UDP.• SOCK_STREAMSOCK_STREAM. Propiedades 1-4. . Propiedades 1-4.
Propiedad 6. TCP.Propiedad 6. TCP.• SOCK_RAWSOCK_RAW. Superusuario. IP.. Superusuario. IP.
Creación y Supresión de un Socket
CreaciónCreación::
int socket (dominio, tipo, protocolo)int socket (dominio, tipo, protocolo)int dominio; int dominio; int tipo;int tipo; int protocolo; int protocolo;
SupresiónSupresión::
closeclose
Enlazamiento socket-dirección
Primitiva bindPrimitiva bind::
int bind (sock, p_direccion, lg)int bind (sock, p_direccion, lg)
int int sock; sock;
struct sockaddr *p_direccion;struct sockaddr *p_direccion;
intint lg; lg;
Enlazamiento socket-dirección
El dominio Unix:El dominio Unix:
ls, rmls, rm
sockunix.c (hoja 5 de Sockets)sockunix.c (hoja 5 de Sockets) El dominio Internet:El dominio Internet:
gethostname, gethostbyname, gethostname, gethostbyname, INADDR_ANYINADDR_ANY
getservbyname, IPPORT_RESERVEDgetservbyname, IPPORT_RESERVED
Enlazamiento socket-dirección
int getsockname (sock, p_adr, p_lg)int getsockname (sock, p_adr, p_lg)
int int sock; sock;
struct sockaddr *p_adr; struct sockaddr *p_adr;
int int *p_lg; *p_lg;
crearsock.c (hoja 7 de Sockets)crearsock.c (hoja 7 de Sockets)
Comunicación por datagramas
Sockets tipo SOCK_DGRAMSockets tipo SOCK_DGRAM Poca fiabilidadPoca fiabilidad Comunicación modo no conectadoComunicación modo no conectado Posible <<pseudoconexión>> (dirección Posible <<pseudoconexión>> (dirección
implícita)implícita)
Envío de mensajes
int sendto (sock, msg, lg, opcion, p_dest, lgdest)int sendto (sock, msg, lg, opcion, p_dest, lgdest)
int int sock; sock;
char char *msg; *msg;
int int lg; lg;
int int opcion; opcion;
struct sockaddr *p_dest;struct sockaddr *p_dest;
int int lgdest; lgdest;
Envío de mensajes
int sendmsg (sock, msg, opcion)int sendmsg (sock, msg, opcion)
int int sock; sock;
struct msghdr msg[];struct msghdr msg[];int int opcion; opcion;
Envío de mensajes
struct msghdr {struct msghdr {
caddr_t msg_name;caddr_t msg_name;
int msg_namelen;int msg_namelen;
struct iovec *msg_iov;struct iovec *msg_iov;
int int msg_iovlen; msg_iovlen;
caddr_t msg_accrights;caddr_t msg_accrights;
int int msg_accrightslen; msg_accrightslen;
}; };
Envío de mensajes
struct iovec {struct iovec {
caddr_t iov_base;caddr_t iov_base;
int iov_len;int iov_len;
};}; msghdr msghdr en en <sys/socket.h><sys/socket.h> iovec iovec en en <sys/uio.h><sys/uio.h>
Recepción de mensajes
int recvfrom (sock, msg, lg, opcion, p_exp, int recvfrom (sock, msg, lg, opcion, p_exp, p_lgexp) p_lgexp)
int int sock; sock;char char *msg; *msg; int int lg; lg;int int opcion; opcion;struct sockaddr *p_exp;struct sockaddr *p_exp; int int *p_lgex; *p_lgex;
Recepción de mensajes
int recvmsg (sock, msg, opcion)int recvmsg (sock, msg, opcion)
int int sock; sock;
struct msghdr msg[];struct msghdr msg[];int int opcion; opcion;
Cliente/Servidor
El Servidor:El Servidor:1.1. Creación y enlace al puerto de servicio de Creación y enlace al puerto de servicio de
un socket.un socket.2.2. Desconexión del servidor de su terminal de Desconexión del servidor de su terminal de
lanzamiento o ejecución.lanzamiento o ejecución.3.3. Bucle infinito en el cual el servidor:Bucle infinito en el cual el servidor:
a.a. Espera una petición.Espera una petición.b.b. La trata.La trata.c.c. Pone la forma de respuesta.Pone la forma de respuesta.d.d. Envía la respuesta.Envía la respuesta.
Cliente/Servidor
El Cliente:El Cliente:
1.1. Creación del socket local.Creación del socket local.
2.2. Preparación de la dirección del Preparación de la dirección del servidor.servidor.
3.3. Envío del mensaje.Envío del mensaje.
4.4. Espera del resultado.Espera del resultado.
5.5. Explotación del resultado.Explotación del resultado.
Ejemplo Cliente/Servidor
Ejemplo Completo (hoja 11 de Sockets).Ejemplo Completo (hoja 11 de Sockets). Estructura Estructura hostenthostent en en netdb.hnetdb.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 Primitiva connectconnect::
int connect (sock, p_adr, lgadr)
int sock;
struct sockaddr *p_adr;int lgadr;
Pseudoconexiones
Primitiva Primitiva socketpairsocketpair::
int socketpair (dominio, tipo, protocolo, p_sock)
int dominio;
int tipo;
int protocolo;
int *p_sock;
Pseudoconexiones
Primitiva Primitiva sendsend::
int send (sock, msg, lg, opcion)int send (sock, msg, lg, opcion)
int int sock; sock;
char char *msg; *msg;
int int lg; lg;
int int opcion; opcion;
Pseudoconexiones
Primitiva Primitiva recvrecv::
int recv (sock, msg, lg, opcion)int recv (sock, msg, lg, opcion)
int int sock; sock;
char char *msg; *msg;
int int lg; lg;
int int opcion; opcion;
Comunicación modo conectado
FiabilidadFiabilidad
Circuito virtualCircuito virtual
telnet, ftp, rlogintelnet, ftp, rlogin
Creación y enlace del socket de escuchasocket/bind
Apertura del serviciolisten
Espera de demanda de conexiónaccept
Creación de un subprocesofork
Tratamiento de la demanda
HIJOPADRE
Punto de vista del servidor
int listen (sock, nb)int listen (sock, nb)
int sock; int sock; int nb;int nb;
int accept (sock, p_adr, p_lgadr)int accept (sock, p_adr, p_lgadr)
int int sock; sock;struct sockaddr *p_adr;struct sockaddr *p_adr; int int
*p_lgadr; *p_lgadr;
Creación (y eventualmente enlace de un socket)socket/bind
Construcción de la dirección del servidor
Demanda de conexiónconnect
Diálogo con el servidor
ÉxitoFallo
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:La emisión:
int write (sock, msg, lg)
int sock;
char *msg;
int lg;
Diálogo servidor/cliente
La emisión: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: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:El corte de la conexión:
int shutdown (desc, sens)int shutdown (desc, sens)
int desc;int desc;
int sens;int sens;