Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sockets
Sockets
Introduccin
Aplicacin
La suite de protocolos TCP/IP es el conjunto de protocolos ms utilizado hoy en da para la comunicacin entre
computadoras que conforman una red.
Se puede sintetizar a los protocolos TCP/IP, por una estructura jerrquica, como la mostrada en la figura 11 .
Aplicaciones
(Telnet, Ftp, DNS, SMTP, SMNP, etc.)
Transporte
TCP
UDP
Internet
ICMP
Protocolo IP
ARP
RARP
Acceso a Red
Acceso LAN:
Ethernet - F. Ethernet
ATM - T. Ring - Etc.
cet
Acceso WAN:
Frame Relay - X.25
Lineas Seriales - Etc.
Diciembre de 2004
20
Investigacin y Desarrollo
Ftp
Server
Web
Server
TCP
20,21
Aplicaciones
Tftp
Server
TCP
80
UDP
69
Interface Sockets
0 ... 65535
0 ... 65535
TCP
UDP
Transporte
Internet
IP
Red
cet
Diciembre de 2004
21
Investigacin y Desarrollo
Aplicacin
Remota
Puerto
Remoto
Red
(LAN - MAN - WAN)
Protocolo de Transporte
Comp. Local
Direcc. IP Local
Comp. Remoto
Direcc. IP Remota
cet
Diciembre de 2004
22
Investigacin y Desarrollo
SERVIDOR
Crear Socket
socket ( )
CLIENTE
Crear Socket
socket ( )
Request
Iniciar Conexin
connect ( )
write ( )
Procesar Request
write ( )
...
Reply
read ( )
...
SERVIDOR
Crear Socket
socket ( )
CLIENTE
Asignar Nombre al Socket
bind ( )
Recibir Datos del Cliente
(con Direcc. del Cliente)
recvfrom ( )
Bloquearse hasta Recibir
Datos del Cliente
Request
Crear Socket
socket ( )
Asignar Nombre al Socket
bind ( )
Enviar Dato al Server
(incluir Direcc Cliente)
sendto ( )
Procesar Request
Se detallarn a continuacin, en forma resumida, las principales llamadas al sistema (system calls) de la
interfase de sockets.
socket
Sintaxis:
Diciembre de 2004
23
Investigacin y Desarrollo
struct in_addr{
u_long s_addrr;
};
struct sockaddr_in {
short
sin_family;
u_short sin_port;
struct in_addr sin_addr;
char
sin_zero[8]
};
La figura 6 muestra la estructura genrica y la estructura
utilizada para el dominio Internet.
El primer miembro de la estructura sockaddr_in, expresa
nuevamente la familia de protocolos utilizada (PF_INET),
el segundo miembro el nmero de puerto, el tercer miembro, una referencia a la estructura sin_addrr, que en realidad define la direccin IP (de all que esta contiene un
nico elemento de 32 bits, que representa los 4 octetos
de la direccin IP). El ltimo elemento no se utiliza10 .
cet
zero
(sin uso)
8B
struct sockaddr
(genrica)
4B
struct sockaddr {
u_short sa_family;
char
sa_data[14];
};
addr
(Ip Addr)
family
14 B
data
(especfico
por familia)
port
2B 2B
family
2B
struct sockaddr_in
(internet)
Diciembre de 2004
24
Investigacin y Desarrollo
listen
Sintaxis:
int listen (int socket, int backlog);
Esta funcin es utilizada por una aplicacin servidora
(en una comunicacin orientada a conexin), para indicar que puede recibir conexiones. El argumento backlog
indica el nmero de conexiones que pueden ser mantenidas en espera hasta que el servidor ejecuta el system
call accept). 11
accept
Sintaxis:
int accept (int sockfd, struct
sockaddr *client, int *addrlen)
Con este system call el servidor espera la conexin
con un cliente. Si es que existe alguna conexin en
espera, se toma la primera de la cola y se crea otro
descriptor de socket que ser utilizado para la escritura
y lectura de datos.
Este system call es del tipo bloqueante, es decir, que
si no existen conexiones pendientes, la aplicacin servidora se detiene en esta funcin esperando hasta que
se produzca una conexin desde el cliente.
Los argumentos client y addrlen, son utilizados para obtener la direccin del proceso cliente que realiz la conexin al servidor. Por lo tanto este system call devuelve en realidad tres valores:
Un entero que indica una condicin de error (si es
negativo) o un nuevo descriptor de socket.
La direccin del proceso cliente.
La longitud de la estructura de direccin del cliente
(para Internet: 16 Bytes).
Con este system call se completa la quntupla mostrada en la figura 3.
connect
Sintaxis:
cet
Diciembre de 2004
25
Investigacin y Desarrollo
Cuando los procesos concluyen la transferencia de datos, ejecutan el system call close(), que enva cualquier
dato que se encuentra en la cola y finaliza la conexin
TCP.
Otras llamadas al sistema
Existe un amplio nmero de llamadas al sistema, que
son necesarias tener en cuenta para escribir rutinas de
comunicacin. Entre ellas se encuentran14 :
Ejemplo
A continuacin se brinda un ejemplo simple de una
aplicacin distribuida cliente/servidor. Para este ejemplo,
se utiliz un protocolo orientado a conexin, con el uso
de sockets de flujo (Stream Sockets). El programa se
realiz utilizando el lenguaje de programacin C++ sobre
sistema operativo Linux.
El ejemplo implementa el diagrama mostrado en la figura
4. La aplicacin servidora, mostrada en la figura 7, est
continuamente esperando mensajes que le envan las
aplicaciones clientes, mostrada en la figura 8. Una vez
que le llega uno de tales mensajes lo muestra en pantalla.
Este ejemplo, aunque simple, muestra la mayora de los
system calls descriptos en el artculo y adems
ejemplifica la estructura general de las aplicaciones cliente/servidor sobre TCP/IP que utilizan la interfase de
sockets.
14 Para una descripcin ms detallada, se puede consultar la bibliografa citada, o bien utilizar las pginas del manual de Linux.
15 La funcin recibe su nombre de: htons host to network short.
Las otras funciones siguen la misma nomenclatura.
16 Estas funciones se utilizan porque la forma de ordenamiento de
los bytes de los procesadores no es uniforme. La notacin de
orden de bytes de red, sigue la notacin big-endian, mientras que
algunos procesadores, como los procesadores Intel, siguen la
notacin little-endian. Con estas funciones, se convierte (si es
necesario) a la notacin big-endian el orden de los bytes de red.
<stdio.h>
<sys/socket.h>
<sys/types.h>
<netinet/in.h>
<netdb.h>
//Puerto de conexin
//Nmero de conexiones permitidas
int main ()
{ int fd1, fd2;
//Descriptores de archivo
int tama_sin;
struct sockaddr_in servidor;
// Info de la direccin de servidor
struct sockaddr_in cliente;
// Info de la direccin del cliente
printf (Servidor\n);
if ((fd1 = socket (AF_INET, SOCK_STREAM, 0)) < 0)
{ printf (Error en Socket()\n);
exit (-1);
}
servidor.sin_family = AF_INET;
servidor.sin_port = htons (PORT);
// Convierte PORT al nmero de red
servidor.sin_addr.s_addr = INADDR_ANY; // coloca ip automaticamente
bzero (&(servidor.sin_zero), 8);
//Coloca ceros en resto estructura
cet
Diciembre de 2004
26
Investigacin y Desarrollo
#include
#include
#include
#include
#include
<stdio.h>
<sys/socket.h>
<sys/types.h>
<netinet/in.h>
<netdb.h>
//Puerto de conexion
//tamao mximo en bytes a transmitir
int main ()
{
int fd, numbytes;
//Descriptores de archivo
char buf[MAX_TAMA_DATO], ip[100];
//Buffer temporario
struct hostent *he;
struct sockaddr_in servidor; //Info de la direccin del servidor
printf (Cliente \nHost o Direccin IP: );
scanf(%s,&ip);
if((he = gethostbyname(ip)) == NULL) //Puede resolver el nombre o ip ?
{ printf (Error en Gethostbyname()\n);
exit(-1);
}
if((fd = socket(AF_INET,SOCK_STREAM,0))<0)
{ printf (Error en Socket()\n);
exit(-1);
}
servidor.sin_family = AF_INET;
servidor.sin_port = htons (PORT);
servidor.sin_addr = *((struct in_addr *)he->h_addr);
bzero (&(servidor.sin_zero), 8);
17 Para poder compilar este cdigo, utilizar la siguiente lnea de comando: $ gcc ilename.c o salida
cet
Diciembre de 2004
27
Investigacin y Desarrollo
Conclusiones
Sergio Saade
Sergio D. Saade recibi el ttulo de Ingeniero Electricista (Orientacin Electrnica) en la Facultad de Ciencias
Exactas y Tecnologa (FACET) de la Universidad Nacional de Tucumn (UNT) en Mayo de 1986.
Entre 1988 y 1990, financiado con becas de la Rotary
Foundation y de la Organizacin de Estados Americanos (OEA) realiz estudios de postgrado en el departamento de Electrical & Computer Enginnering de
la University Of California, Estados Unidos de Amrica, obteniendo el ttulo de Master of Science.
Desde 1991 se desempea como Profesor Asociado en
el Depto. de Electricidad, Electrnica y Computacin,
de la FACET, UNT, estando a cargo del dictado de las
materias Sistemas Operativos y Redes de Area Local
de la carrera Ingeniera en Computacin.
En la actualidad, adems de sus funciones docentes,
est a cargo de la Direccin de la Carrera de Ingeniera
en Computacin.
Jos L. Borelli
Jos L. Borelli recibi el titulo de Tcnico en Computacin en la Escuela Tcnica N3 Gral. Martn Miguel de
Gemes de la ciudad de Salta en el ao 1.996.
En 1997 ingres a la carrera de Ingeniera en Computacin en la Facultad de Ciencias Exactas y Tecnologa,
de la Universidad Nacional de Tucumn, en donde actualmente esta cursando las ltimas asignaturas y realizando su Trabajo de Graduacin que versa sobre Seguridad
en Redes Linux.
Desde 1999 se desempea como ayudante estudiantil
de las ctedras de Bases de Computacin, Programacin 1 y Programacin 2 y desde 2001 como pasante en el rea de soporte en una empresa de Computacin y Comunicaciones de Tucumn.
Diciembre de 2004
28