Programacion en C/C++
Sockets en Windows - Introducción a los Sockets |
Escrito por adrianvaca | |||||||
Domingo, 20 de Marzo de 2011 19:28 | |||||||
Página 2 de 5
Los Sockets se caracterizan por un dominio, un tipo y un protocolo de comunicación. Los dominios más comunes son: El dominio de comunicación nos dice como ser va a realizar la comunicación de los procesos que se van a intercomunicar, o mejor dicho, en que ambiente. Si los procesos se comunicarán bajo la forma de un único sistema (tipo root de Unix), el dominio de comunicación será AF_UNIX, si los procesos se comunicarán como sistemas independientes y estos se hallan unidos mediante una red TCP/IP, el dominio de comunicación será AF_INET. Cabe aclarar que existen otros dominios de comunicación. Los sockets no se han diseñado solamente para TCP/IP. La idea original fue que se usase la misma interfaz también para distintas familias de protocolos. En esta introducción solo trataremos el dominio AF_INET. Algunos dominios:
Los tipos más comunes son: Sockets Stream: son los más utilizados, hacen uso del protocolo TCP, el cual nos provee un flujo de datos bidireccional, secuenciado, sin duplicación de paquetes y libre de errores. Sockets Datagram: hacen uso del protocolo UDP, el cual nos provee un flujo de datos bidireccional, pero los paquetes pueden llegar fuera de secuencia, pueden no llegar o contener errores. Por lo tanto el proceso que recibe los datos debe realizar re-secuenciamiento, eliminar duplicados y asegurar la confiabilidad. Se llaman también sockets sin conexión, porque no hay que mantener una conexión activa, como en el caso de sockets stream. Son utilizados para transferencia de información paquete por paquete. Ejemplo: dns, tftp, bootp, etc. Entones podríamos preguntar, Cómo hacen estos programas para funcionar si pueden perder datos ? Ellos implementan un protocolo encima de UDP que realiza control de errores. Sockets SeqPacket: Establece una conexión fiable bidireccional con un tamaño de mensaje máximo definido. (Este tipo puede no estar habilitado en algunos sistemas.) Sockets Raw: no son para el usuario común, son provistos principalmente para aquellos interesados en desarrollar nuevos protocolos de comunicación o para hacer uso de facilidades ocultas de un protocolo existente. Cada tipo de Sockets tiene uno o más protocolos: TCP/IP (Streams) UDP (Datagram) Uso de Sockets: Los sockets basados en la conexión son cliente-servidor: el servidor espera por una conexión del cliente. Los sockets Independientes de la conexión son de igual a igual (peer-to-peer): cada proceso es simétrico. Almacenamiento de datos (Byte order) Network byte order y Host byte order son dos formas en las que el sistema puede almacenar los datos en memoria. Está relacionado con el orden en que se almacenan los bytes en la memoria RAM. Si al almacenar un short int (2 bytes) o un long int (4 bytes) en RAM, y en la posición más alta se almacena el byte menos significativo, entonces está en network byte order, caso contrario es host byte order. Esto depende del microprocesador que se esté utilizando, podríamos estar programando en un sistema host byte order o network byte order, pero cuando enviamos los datos por la red deben ir en un orden especificado, sino enviaríamos todos los datos al revés. Lo mismo sucede cuando recibimos datos de la red, debemos ordenarlos al orden que utiliza nuestro sistema. Debemos cumplir las siguientes reglas:
Para realizar estas conversiones utilizamos las funciones que se describen a continuación. Funciones de conversión htons() - host to network short - convierte un short int de host byte order a network byte order. htonl() - host to network long - convierte un long int de host byte order a network byte order. ntohs() - network to host short - convierte un short int de network byte order a host byte order. ntohl() - network to host long - convierte un long int de network byte order a host byte order. Puede ser que el sistema donde se esté programando almacene los datos en network byte order y no haga falta realizar ninguna conversión, pero si tratamos de compilar el mismo código fuente en otra plataforma host byte order no funcionará. Como conclusión, para que nuestro código fuente sea portable se debe utilizar siempre las funciones de conversión. Uso de puertos Note que para iniciar un tipo de comunicación mediante un socket se requiere designar un puerto de comunicaciones. Esto significa que algunos puertos deben reservarse para éstos usos bien conocidos. 0-1023: Estos puertos pueden ser sólo enlazados por el sistema 1024-5000: Puertos designados a aplicaciones conocidas 5001-64K-1: Puertos disponibles para usos particulares Modelo Simple Cliente-Servidor: Conexión Stream En el siguiente gráfico se muestran los procesos que se ejecutan cuando se realiza una conexión Simple Cliente-Servidor: Teoría de conexión: En el servidor:
En el cliente:
Modelo Concurrente Cliente-Servidor: Conexión Stream En el siguiente gráfico se muestran los procesos que se ejecutan cuando se realiza una conexión Concurrente Cliente-Servidor: Teoría de conexión: En el servidor:
En el cliente:
Modelo Cliente-Servidor: Conexión Datagram En el siguiente gráfico se muestran los procesos que se ejecutan cuando se realiza una conexión Cliente-Servidor mediante Datagrams: Teoría de conexión: En el servidor:
En el cliente:
|
|||||||
Última actualización el Domingo, 20 de Marzo de 2011 19:33 |
Otros artículos | |
Comentarios
Primero el servidor luego el cliente
Suscripción de noticias RSS para comentarios de esta entrada.