Publicado el 25 de Marzo del 2019
1.138 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
noviembre de 2004
5
Redes
Ingeniería Informática
Nombres (II)
longitud
familia
datos (14 bytes)
longitud AF_INET
nº puerto (2 bytes)
Dir IPv4 (4 bytes)
relleno (8 bytes)
Longitud fija:
16 bytes
Longitud fija:
16 bytes
Universidad de Oviedo
longitud AF_LOCAL
pathname
(hasta 104 bytes)
noviembre de 2004
Longitud variable
6
Universidad de Oviedo
Redes
Ingeniería Informática
Rellenando la una dirección:
Ejemplo I:
sock_addr.sin_addr.s_addr = htonl(INADDR_ANY);
sock_addr.sin_port = htons(0);
sock_addr.sin_family = AF_INET;
Ejemplo II:
sock_addr.sin_addr.s_addr = inet_addr(“128.59.69.7”);
sock_addr.sin_port = htons(5115);
sock_addr.sin_family = AF_INET
noviembre de 2004
7
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
8
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
9
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
10
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
11
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
12
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
13
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
14
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
15
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
16
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
17
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
18
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
19
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
20
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
21
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
22
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
23
Redes
Ingeniería Informática
Universidad de Oviedo
noviembre de 2004
24
Redes
Ingeniería Informática
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:
• close() ⇔ closesocket()
• ioct() ⇔ ioctlsocket() / WSAIoctl()
• Número máximo de sockets soportados
– El número máximo de sockets que puede usar una
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
Comentarios de: Programación con Sockets - Introducción (0)
No hay comentarios