Anuncios

Bienvenidos sean a este post, hoy veremos una breve explicacion de sockets.

Anuncios
Anuncios

En el post anterior mencionamos que utilizamos al socket como un archivo para poder enviar informacion a traves de la red. Es decir, todo lo que escribamos en el socket sera enviado por la red a su destino, y todo lo recibido es porque se escribio en el socket. Siendo esta la forma que posee el S.O para comunicarse en ambos sentidos. Vamos a suponer que tenemos dos aplicaciones que trabajan con la red, una puede ser un navegador y la otra un servicio de mensajeria. El navegador representa a una aplicacion cliente en una arquitectura de red de cliente-servidor. Siendo el servidor el equipo encargado de enviar la informacion solicitada por el cliente. Tomemos el ejemplo de ir a un sitio web, pasamos la direccion web y la respuesta es la pagina que se muestra en el navegador. Cuando realicemos esto, se solicita un socket al S.O. Si lo vemos desde el punto de vista del programador, el navegador crea un socket usando el API provisto por el S.O. Tambien podemos describir a este con un postfijo especifico: socket cliente. Del lado del servidor para procesar las solicitudes del cliente, este debe escuchar por conexiones entrantes, este crea socket denominados como server e intentara escuchar a estas conexiones.

Anuncios
Anuncios

Cuando la conexion es establecida entre ellos, cliente y servidor, podemos decir que la comunicacion de datos puede proceder. En el post anterior mencionamos que para enviar los paquetes se utiliza al protocolo TCP/IP. Este asigna una direccion IP que servira como identificacion en la red, una direccion de ejemplo puede ser: 10.0.176.226. Esta direccion es «unica» en Internet, como asi tambien sucede en los distintos tipos de redes. Por lo general, esta direccion es provista por el ISP (Internet Service Provider) para el caso de Internet. En cambio para una LAN, sera provisto por un servidor de DCHP (Dynamic Host Configuration Protocol). Por lo tanto, no es un tema que intervengamos salvo que usemos una IP fija establecida por alguna necesidad, por ejemplo necesitar habilitar un puerto especifico a traves de un Firewall.

Anuncios
Anuncios

Cuando creamos el socket, este utiliza la direccion IP del equipo, esto se lo denomina como «unir» el socket a la direccion. Cuando lo usamos para enviar la informacion, debemos establecer la direccion IP pero del destinatario. Sabemos que esta direccion IP esta almacenada en el otro socket, y sabemos que debemos conectar a estos dos sockets para establecer la conexion pero que sucede si tenemos multiples aplicaciones corriendo en el dispositivo? Y que sucede si cada una de estas creo un socket para ser utilizado? Como sabemos cual es el socket que debe recibir la informacion? Aqui entra en accion otro elemento conocido como Puerto.

Anuncios
Anuncios

Este es un valor que es asignado parcialmente por el S.O. Pero por que es parcialmente? Porque si bien podemos usar un rango del valor de 0 a 65535 para asignar un puerto, los valores de 0 a 1023 se encuentran reservados para distintos servicios tanto del S.O como de protocolos. Por ejemplo, el puerto de un servidor web o HTTP es el 80, y el puerto seguro del HTTP (HTTPS) es el 443. Por lo tanto, estos puertos no pueden ser usados pero si a partir del 1024 en adelante. Aunque debemos tener cuidado porque algunos de estos se encuentran registrados por aplicaciones o programas. Por ejemplo, la base de datos MS SQL utiliza al puerto 1433 para conexion, o el VNC utiliza al puerto 5800 para conectarse mediante HTTP. Si bien, no se prohibe el uso de estos puertos si debemos tener en cuenta que podemos entrar en conflictos con estos. Inclusive se pueden modificar para que se conecten a otros puertos.

Anuncios
Anuncios

Ahora sabemos que el socket tendra dos datos para poder encontrar y conectarse al otro equipo, como son la direccion IP y el puerto respectivamente. Para poder trabajar con esto desde nuestros codigos se debe diseñar una clase wrapper (envolvedora) que encapsule al socket POSIX (Portable Operating System Interface). Tambien conocidos como sockets Berkeley o BSD, este contiene un conjunto de funciones para la programacion de los sockets. Cuando necesitemos usarlos, vamos a depender de las API del S.O. Esta representa las funciones y objetos que son usadas para crear a los sockets, enviar datos recibirlos, etc.

Anuncios

POSIX representa a la conexion como un descriptor de archivo, tal como mencionamos al inicio, y estos siguen la filosofia de UNIX de proveer una interfaz comun para el envio y recepcion de los datos. Veamos la siguiente linea:

int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
Anuncios

Esta es la creacion de un socket mediante la funcion socket que esta definida en la libreria sys/socket.h. Pero antes de comentar que es cada elemento pasado como argumento veamos la definicion de esta funcion en la libreria:

int socket(int domain, int type, int protocol);
Anuncios
Anuncios

Los tres argumentos que son de tipo numerico, en este caso tipo entero o int. El primero representa como sera el tipo de direccion que buscaremos. Hasta el momento de publicado este post, existen dos tipos de direccion IP, la version IPv4 y la version IPv6. Ambas se estan utilizando pero mayoritariamente la primera, y la direccion que pase de ejemplo es de este tipo. Si volvemos a la creacion del socket pasamos que la direccion del otro equipo sera de IPv4, si necesitamos usar a IPv6 debemos pasar este valor: AF_INET6. El segundo parametro es para especificar el tipo de socket que sera. Este es para indicar si sera de tipo orientado a stream o datagrama. En el ejemplo de creacion pasamos que sera orientado al tipo stream. El ultimo parametro esta relacionado con el anterior, porque sera el protocolo que usaremos y debe mantener cierta coherencia sobre como sera el tipo de socket. Volviendo al ejemplo, pasamos a TCP, el cual es un protocolo que tiene mucha fama porque solamente manda los paquetes si ambos extremos estan conectados, aunque en la vida real esto no es tan asi porque tambien permite otro tipo de envio de datos pero eso sera tema para otro post. Tambien cabe aclarar que existen otros protocolos de red pero han perdido popularidad con respecto a TCP/IP.

Anuncios

En resumen, hoy hemos visto a los socket, que es, para que sirve, como se compone, como se utiliza, algunos conductas de estos, asi como otros temas relacionados al envio de informacion, como tambien un ejemplo de como se puede crear uno y algunos datos que podemos pasar. Espero les haya resultado de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50