1.136 visualizaciones desde el 25 de Marzo del 2019
399,3 KB
31 paginas
Creado hace 20a (08/11/2004)
Redes
Ingeniería Informática
Universidad de Oviedo
Programación con
Sockets
INTRODUCCIÓN
noviembre de 2004
1
Redes
Ingeniería Informática
Universidad de Oviedo
¿Qué son los Sockets ?
• Son un mecanismo de comunicación entre
procesos:
– Dentro de una misma máquina.
– Distribuidos en diferentes máquinas.
• Que pueden ser identificados mediante un nombre.
• Proporcionan un interfaz estándar para el acceso a
diferentes protocolos de comunicaciones.
• Soportan, entre otros, la pila de protocolos TCP/IP.
– Acceso a servicios de transporte orientados a conexión
(TCP)
– Acceso a servicios de transporte orientados a datagrama
(UDP)
– Acceso a servicios de capa de red (IP)
noviembre de 2004
2
Redes
Ingeniería Informática
Tipos de Sockets
• Stream (SOCK_STREAM):
Universidad de Oviedo
– Flujo de datos bidireccional, fiable, ordenado y sin duplicados.
– En la recepción no se conservan marcas relacionadas con la
forma en que fueron enviados.
• Datagrama (SOCK_DGRAM):
– Flujo de datos bidireccional, sin garantías de fiabilidad, orden
o evitación de duplicados.
– Los datos se recibes en los mismos bloques en que fueron
enviados.
• Otros tipos:
– Raw (SOCK_RAW)
– Paquetes Secuenciados (SOCK_SEQPAQUET)
noviembre de 2004
3
Redes
Ingeniería Informática
Universidad de Oviedo
Dominios de Sockets
• Cada socket está asociado a un dominio de
comunicaciones.
• Un dominio es una abstracción introducida para
encapsular propiedades comunes de los sockets
involucrados en la comunicación:
– Esquema usado para nombre el socket.
– Tipos de sockets disponibles dentro del dominio.
– Protocolos de comunicaciones utilizados.
– ...
• La familia que soporta la pila de protocolos TCP/IP es:
PF_INET o AF_INET
noviembre de 2004
4
Redes
Ingeniería Informática
Universidad de Oviedo
Nombres (I)
• La estructura del nombre o dirección de un socket
depende de la familia a la que pertenece.
• La API utiliza una estructura genérica en la declaración
de las funciones.
struct sockaddr {
uint8_t
sa_family_t
char
sa_len;
sa_family;
sa_data[14];
// address family: AF_XXX value
// protocol specific address
};
• Proporciona estructuras particularizadas para cada
familia de sockets soportada.
– struct sockaddr_in
– struct sockaddr_un
Programación con Windows Sockets (I)
• Tipo de dato del socket: SOCKET
– La validez de un socket se comprueba comparando con
Universidad de Oviedo
INVALID_SOCKET
Estilo BSD:
Estilo recomendado:
/* or s < 0 */
s = socket(...);
if (s == -1)
{...}
s = socket(...);
if (s == INVALID_SOCKET)
{...}
noviembre de 2004
25
Redes
Ingeniería Informática
Universidad de Oviedo
Programación con Windows Sockets (II)
• Función Select() y FD_*
– La sintaxis y funcionalidad se mantiene, aunque:
• Sólo es aplicable a sockets.
• El número máximo de descriptores a comprobar no se
emplea
– Los conjuntos de sockets se representan con el tipo fd_set,
aunque se implementan como un array de sockets.
– Para evitar problemas de compatibilidad se recomienda
emplear las macros FD_XXX para:
• Activar
• Inicializar
• Borrar
• Comprobar
dichos conjuntos.
noviembre de 2004
26
Redes
Ingeniería Informática
Programación con Windows Sockets (III)
• Códigos de Error
Universidad de Oviedo
– La causa de un error no está disponible a través de la
variable errno.
– Para acceder a los códigos de error debe usarse la función
WSAGetLastError().
– Para mantener compatibilidad a nivel de código con BSD,
se puede hacer la siguiente definición:
#define errno WSAGetLastError()
En Windows:
En UNIX:
int WSAGetLastError() {return errno}
noviembre de 2004
27
Redes
Ingeniería Informática
Programación con Windows Sockets (IV)
• Códigos de Error (cont.)
Universidad de Oviedo
Estilo BSD:
r = recv(...);
if (r == -1 && errno == EWOULDBLOCK)
{...}
Estilo recomendado:
r = recv(...);
if (r == -1 && WSAGetLastError()== EWOULDBLOCK)
{...}
noviembre de 2004
28
Redes
Ingeniería Informática
Programación con Windows Sockets (V)
• Cambio de nombre en funciones:
Universidad de Oviedo
– En dos casos ha sido necesario cambiar el nombre de las
funciones usadas por la librería Berkeley Sockets:
determinada aplicación depende de la implementación de
Winsock empleada y se conoce a través de WSAStartUp()
– Además existe la constante FD_SETSIZE que fija el
tamaño máximo de las estructuras fd_set. Por defecto es
64.
noviembre de 2004
29
Redes
Ingeniería Informática
Programación con Windows Sockets (VI)
• Fichero de inclusión:
Universidad de Oviedo
– Winsock2.h
• Comprobación del fallo de una función:
Estilo BSD:
r = recv(...);
if (r == -1 && errno == EWOULDBLOCK)
{...}
Estilo recomendado:
r = recv(...);
if (r == SOCKET_ERROR && WSAGetLastError()==
EWOULDBLOCK)
{...}
noviembre de 2004
30
Redes
Ingeniería Informática
Programación con Windows Sockets (VII)
• Orden de los bytes:
Universidad de Oviedo
– El orden de los bytes en la arquitectura Intel es diferente
del empleado por la red.
•
– Cualquier referencia a direcciones IP o números de puerto
pasadas desde o hacia una función WinSock debe estar en
orden de red.
Inicialización y terminación de los programas:
– Es necesario usar la función WSAStartup() antes de hacer
ninguna llamada a las funciones de sockets para inicializar
la DLL compartida (winsock.dll)
– Es necesario ejecutar la función WSACleanup() al finalizar
para liberar los recursos ocupados en la DLL
noviembre de 2004
31
Links de descarga
http://lwp-l.com/pdf15574
Comentarios de: Programación con Sockets - Introducción (0)
Comentarios de: Programación con Sockets - Introducción (0)
No hay comentarios