domingo, 13 de junio de 2010

Programacion de Sookets en C y C++

INTRODUCCION A LOS SOCKETS

Hace un buen tiempo tuve que desarrollar un trabajo con sockets en C , pero OH sorpresa al mirar por la red, estos textos sobre sockets eran realmente escasos y muy poco detallados , por lo que me he decidido, comentar y explicar sobre los sockets, con el fin de "ser una luz en el camino" para todo aquel que lo necesite, y pues claro nadie es perfecto así que si meto la pata en algo,  una sugerencia es bienvenida, pues bien, empecemos ¿ que es un socket?  bien un socket es un medio para un fin y cual es ese fin? el fin es la comunicación entre dos equipos que están separados físicamente pero conectados a la misma red,, un socket es básicamente un concepto abstracto que identifica una forma para que 2 programas (posiblemente situados en computadoras distintas) pueden intercambiar cualquier flujo de datos, generalmente de manera fiable y ordenada, o sease es un método para la comunicación entre un programa del cliente y un programa del servidor en una red y  se define como el punto final en una conexión. (Edited by Programador Bogotano)

Para que dos programas puedan comunicarse entre sí es y trasferirse datos entre si, es necesario que se cumplan ciertos requisitos:
  • Que un programa sea capaz de localizar al otro. (Direccion IP, DNS)
  • Que ambos programas sean capaces de intercambiarse cualquier secuencia de Datos, es decir, datos relevantes a su finalidad.(Protocolo TCP IP HTTTP)
Para ello son necesarios los tres recursos que originan el concepto de socket:
  • Un protocolo de comunicaciones, que permite el intercambio de octetos
  • Una dirección del Protocolo de Red (Dirección IP, si se utiliza el Protocolo TCP/IP), que identifica una computadora.
  • Un número de puerto, que identifica a un programa dentro de una computadora.
Los sockets permiten implementar una arquitectura muy particular conocida como arquitectura de cliente y servidor . La comunicación ha de ser iniciada por uno de los programas que se denomina programa cliente. El segundo programa el servidor, espera a que otro inicie la comunicación, por este motivo se denomina programa servidor, pues esta a la espera para servir un servicio.

Un socket es un fichero existente en la máquina cliente y en la máquina servidora, que sirve en última instancia para que el programa servidor y el cliente lean y escriban la información. Esta información será la transmitida por las diferentes capas de red.


Los sockets se crean y se utilizan con un sistema de peticiones o de llamadas de función a veces llamados interfaz de programación de aplicación de sockets (API, application programming interface) dentro del sistema operativo (Wintendo Linux MacOx etc..). Básicamente la definición de un socket es la de un teléfono, usamos el teléfono para comunicar 2 casas o 2 empresas, la red puede variar puede ser una red telefónica, o una red de radiofrecuencia, puede ser una red que conecta 2 equipos distantes, o puede ser una red que conecta 2 teléfonos dentro de un mismo edificio de una compañía como un citófono. (Edited by Programador Bogotano)

Basicamente un socket es una una forma de intercomunicar dos programas o dos procesos con el fin de establecer una comunicacion es decir un flujo de datos entre uno y otro, los programas de origen y destino, o cliente y servidor, pueden estar en maquinas distintas o en la misma maquina. (Edited by Programador Bogotano)

Que necesitamos para identificar o para crear un socket? necesitamos primero una direccion IP , ademas necesitamos, un puerto y un protocolo. una direccion IP son 4 numeros que van de 0 a 255 o sea 4 octetos de bits una direccion IP puede ir desde 0.0.0.0 que es la direccion IP mas baja, hasta 255.255.255.255 que es la direccion IP mas alta, como sabemos la computadora solo maneja ceros y unos asi que estas direcciones se representarian como :

0.0.0.0 = 00000000.00000000.00000000.00000000

255.255.255.255 = 11111111.11111111.11111111.11111111


Espero que con la breve explicacion anterior haya quedado claro porque se dicen que son 4 octetos de bits los que componen una dirección IP. Basicamente una direccion IP se podria comparar con un numero de telefono, si vas a llamar a alguien debes saber su numero de telefono, de la misma forma si vas a crear un socket o crear una conexion debes conocer su direccion IP, actualmente se maneja en la red el protocolo IPV4 que es la que explique anteriormente. (Edited by Programador Bogotano)

Cada ordenador de una red tiene asignado un número único (La direccion IP), que sirve para identificarle y distinguirle de los demás equipos en la red es como su direccion, asi cuando un ordenador quiere hablar con otro, manda la información a dicho número. Es similar a nuestros  teléfonos. Si quiero hablar con mi amiga "Adriana", primero marco su número de teléfono y luego espero a que ella conteste para hablar con ella. (Edited by Programador Bogotano)

El servidor no necesita la dirección IP de ninguno de los ordenadores, al igual que nosotros, para recibir una llamada por teléfono, no necesitamos saber el número de nadie, ni siquiera el nuestro. El cliente sí necesita saber la direccion IP del servidor, al igual que nosotros para llamar a alguien necesitamos saber su número de teléfono. (Edited by Programador Bogotano)

La dirección IP es un número que como vimos se escribo comopor ejemplo 192.100.23.4.  ya lo habras  visto en Internet. En resumidas cuentas, el cliente debe conocer a qué ordenador desea conectarse. En nuestro navegador de Internet facilitamos la dirección IP del servidor al que queremos conectarnos a través de su nombre . Obviamente este nombre hay que traducirlo a una dirección IP, pero nuestro navegador e Internet se encargan de eso por nosotros.  (Edited by Programador Bogotano)


Ademas de esto debes conocer el puerto que se utilizara para llevar a cabo la comunicación, los puertos son designados con un numero o identificador que comienza desde 1 y va hasta 65535, si por ejemplo conoces el numero de telefono de una empresa y deseas comunicarte con una area especifica de la empresa como por ejemplo ventas o servicio al cliente debes conocer el numero de la extensión, los puertos mas usados son por ejemplo el 80 de http el 21 de ftp el 23 de Telnet etc. todo depende de  para que vayas a usar  la conexión para eso seleccionaras un puerto u otro

En un mismo Computador puede estar corriendo varios programas servidores, cada uno de ellos dando un servicio distinto. Por ejemplo, un ordenador puede tener un servidor de Counter Strike y un servidor de páginas Web como apache corriendo a la vez. Cuando un cliente desea conectarse, debe indicar qué servicio quiere, igual que al llamar a una empresa necesitamos decir la extensión de la persona con la que queremos hablar o, al menos, decir su nombre o el departamento al que pertenece para que la telefonista nos ponga con la persona con la que queremos hablar.

Por ello, cada servicio dentro del ordenador debe tener un número único que lo identifique (como la extensión de teléfono). Estos números son enteros normales y van de 1 a 65535. Los número bajos, desde 1 a 1023 están reservados para servicios habituales de los sistemas operativos (www, ftp, mail, ping, etc). El resto están a disposición del programador y sirven para cosas como Counter Strike.

Tanto el servidor como el cliente deben conocer el número del servicio al que atienden o se conectan. El servidor le indica al sistema operativo  qué servicio quiere atender, al igual que en una empresa el empleado recién contratado (o alguien en su lugar) debe informar a la telefonista en qué extensión se encuentra.

El cliente, cuando llame a la empresa, debe dar el número de extensión (o nombre de empleado), de forma que la telefonista le ponga con la persona adecuada. En el caso del navegador de Internet, estamos indicando el servicio con el http en http:.xxx.com servicio de páginas web. También es posible, por ejemplo "ftp.xxx.com", si xxx.com admite clientes ftp. Nuestro computador es lo suficientemente listo como para saber a qué número corresponden esos servicios.

Deberemos manejar varios protocolos, primero deberemos saber que existen dos tipos de conexiones en internet o en las redes, el protocolo TCP y el protocolo UDP, el primero basicamente garantiza que todos los datos trasmitidos van a llegar de un programa al otro correctamente, es decir sin errores . Se utiliza cuando la información a transmitir es importante, no se puede perder ningún dato, ni un solo bit o byte debe ser alterado durante la trasmision  y no importa que los programas se queden "bloqueados" esperando o transmitiendo datos. Si uno de los programas está atareado en otra cosa y no atiende la comunicación, el otro quedará bloqueado hasta que el primero lea o escriba los datos que se estan trasmitiendo.

El segundo, el protocolo UDP (User datagram protocol)  no es necesario que los programas se conecten. Cualquiera de ellos puede transmitir datos en cualquier momento, independientemente de que el otro programa esté "escuchando" o no. este protocolo garantiza que los datos que lleguen son correctos, pero no garantiza que lleguen todos. Se utiliza cuando es muy importante que el programa no se quede bloqueado y no importa que se pierdan datos. Imaginemos, por ejemplo, un programa que está controlando la temperatura de un reactor nuclear y envía dicha temperatura a un computador en una sala de control para que éste presente unos gráficos de temperatura. Obviamente es más importante el control del reactor que el perfecto refresco de los gráficos. El programa no se puede quedar bloqueado sin atender al horno simplemente porque el ordenador que muestra los gráficos esté ocupado en otra cosa.

Ademas de esto tendresmo en cuenta que los servicios tambien manejan protoclos dependiendo del puerto que usen, por lo general el servicio de paginas web o http estara corriendo sobre el puerto 80, el puerto para el intercambio de archivos, sobre el 21 etc , esto es importante recordarlos pues tambien, son procolos.

No hay comentarios: