Usando Internet Sockets Brian "Beej" Hall Copyright by Brian "Beej" Hall

Tamaño: px
Comenzar la demostración a partir de la página:

Download "Usando Internet Sockets Brian "Beej" Hall beej@piratehaven.org Copyright 1995-2001 by Brian "Beej" Hall"

Transcripción

1 Usando Internet Sockets Brian "Beej" Hall Copyright by Brian "Beej" Hall Historia Revision Version August, 1995 Revised by: beej Initial version. Revision Version January 13, 1999 Revised by: beej Latest HTML version. Revision Version March 6, 2001 Revised by: beej Converted to DocBook XML, corrections, additions. Revision Version April 2, 2001 Revised by: beej inet_aton() return values corrected, selectserver changed, typos fixed, added recvtimeout(). Traducción al español Domingo 22 de Abril de 2001 por: 1

2 Índice 1. INTRODUCCIÓN AUDIENCIA PLATAFORMA Y COMPILADOR PAGINA OFICIAL NOTA PARA SOLARIS/SUNOS NOTA PARA WINDOWS MIRRORS NOTA PARA LOS TRADUCTORES COPYRIGHT Y DISTRIBUCIÓN 6 2. QUÉ ES UN SOCKET? DOS TIPOS DE SOCKETS DE INTERNET COSAS DE BAJO NIVEL Y TEORÍA DE RED 8 3. STRUCTS Y MANEJO DE DATOS CONVIRTIENDO A LOS NATIVOS! DIRECCIONES IP Y COMO LIDIAR CON ELLAS LLAMADAS AL SISTEMA SOCKET() CONSIGUE EL DESCRIPTOR DE ARCHIVO! BIND() - EN QUE PUERTO ESTOY? CONNECT() HEY, TÚ! LISTEN() - ALGUIEN ME LLAMARÍA POR FAVOR? ACCEPT() - GRACIAS POR LLAMAR AL PUERTO SEND() Y RECV() - HÁBLAME, BABY! SENDTO() Y RECVFROM() HÁBLAME, AL ESTILO DGRAM! CLOSE() Y SHUTDOWN() SALE DE MI VISTA! GETPEERNAME() QUIÉN ERES? GETHOSTNAME() QUIÉN DIABLOS SOY? DNS TÚ DICES WHITEHOUSE.GOV, YO DIGO SISTEMA CLIENTE-SERVIDOR UN SIMPLE SERVIDOR DE FLUJO (STREAM) UN SIMPLE CLIENTE DE FLUJO DATAGRAM SOCKETS 30 2

3 6. TÉCNICAS LIGERAMENTE AVANZADAS BLOQUEANDO SELECT() MULTIPLEXAMIENTO SINCRONIZADO DE E/S MANEJANDO ENVÍOS (SEND()S ) PARCIALES HIJO DE LA ENCAPSULACIÓN MÁS REFERENCIAS PÁGINAS MAN LIBROS RFCS PREGUNTAS COMUNES DESLIGAMIENTO DE RESPONSABILIDAD Y PETICIÓN DE AYUDA 49 3

4 1. Introducción Hey! La programación en Socket te tiene bajoneao? Esto es muy difícil para aprenderlo de las páginas man? Quieres hacer un programa genial para Internet, pero no tienes tiempo para gastar tratando de descifrar si tienes que llamar bind() antes de connect(), etc, etc. Bueno, adivina! Yo ya he hecho este asqueroso trabajo, y me muero por compartir la información con todos! Has llegado al lugar indicado. Este documento debería darle al programador(a) C el apoyo que necesita para dedicarse a la programación en red Audiencia Este documento ha sido escrito como un tutorial, no como una referencia. Será de mejor ayuda a quienes están empezando en la programación con Sockets y están buscando un puntapié. Realmente no es la guía definitiva para programación, pero todo vale. Espero, fuertemente, que sea suficiente para que esas páginas man empiecen a tener sentido Plataforma y Compilador Los ejemplos que contiene este documentos fueron compilados en un PC Linux usando el compilador GNU gcc. Deberían, de todas maneras, poder ser construidos en cualquier sistema que use gcc. Naturalmente, esto no se aplica si estás programando en Windows (ve la sección de Windows, abajo) Pagina Oficial La dirección oficial de este documento es: La dirección de la traducción es español es: Nota para Solaris/SunOs Cuando se compila para Solaris o SunOS, necesitas especificar algunas líneas extras de comandos para linkear las librerías apropiadas. Para hacer esto, simplemente añade: - lnsl -lsocket -lresolv al final del comando para compilar, más o menos así: $ cc o server server.c -lnsl -lsocket -lresolv Si sigues teniendo errores, podrías tratar agregando -lxnet al final de la línea. Yo no sé que hace eso, exactamente, pero algunas personas parecen necesitarlo. 4

5 1.5 Nota para Windows Tengo un particular disgusto por Windows, y te recomiendo que pruebes Linux, BSD o Unix. Que quede dicho, tú aun puedes usar esto bajo Windows. Primero, ignora casi todos los encabezados que menciono en este documento. Todo lo que necesitas incluir es: #include <winsock.h> Espera! Además tienes que hacer una llamada a WSAStartup() antes de hacer algo con la librería de Sockets. El código para hacer eso, es mas o menos: #include <winsock.h> { WSAData wsadata; If (WSAStartup{MAKEWORD(1, 1), &wsadata!= 0) { Fprintf(stderr, WSAStartup failed.\n ); Exit(1); Una vez hecho esto, el resto de los ejemplos en este tutorial deberían funcionar, con unas pocas excepciones. Por un lado, no puedes usar close() para cerrar un socket, necesitas usar closesocket(), en vez. Además, select() sólo trabaja con descriptores de socket, no con descriptores de archivo (como 0 para stdin). Para más información sobre Winsock, lee el FAQ de Winsock Mirrors Eres bienvenido si deseas hacer un mirror de este sitio. Ya sea público o privado. Si es público y deseas que yo lo linkee desde la página oficial, tírame un mail a beej@piratehaven.org Nota para los Traductores Si deseas traducir esta guía a otro lenguaje, escríbeme y yo pondré la dirección en mi página. Siéntete libre de agregar tu nombre e a la traducción. 5

6 1.8. Copyright y Distribución Beej s Guide to Network Programming es Copyright Brian Beej Hall. Esta guía puede ser reimpresa libremente, siempre que no sea alterada, y se mantengan los derechos de autor intactos. Se recomienda a los educadores que provean esta guía a sus estudiantes. Esta guía puede ser traducida libremente en cualquier lenguaje, y debe ser enteramente traducida. La traducción puede incluir el nombre y la manera de contactar al traductor. El código C presentado en este documento es dado al dominio público. Contactar a beej@piratehaven.org para más información. Contactar a kaosk@hotpop.com para más información (traductor). 6

7 2. Qué es un Socket? Tú escuchas sobre Sockets todo el tiempo, y quizás te está preguntado que son exactamente. Bueno, son esto: una manera de habla a otro programa usando descriptores de archivos Unix estándar. Qué!? Ok, tu debes haber escuchado que todo en Unix es un archivo. Lo que esto quiere decir es que cuando un programa Unix realiza cualquier tipo de E/S, lo hacen leyendo o escribiendo a un descriptor de archivo. Un descriptor de archivo es simplemente un numero entero asociado a un archivo abierto. Pero (y aquí está la conexión), ese archivo puede ser una conexión de red, un FIFO, un terminal, un archivo real en el disco, o cualquier otra cosa. Todo en Unix es un archivo. Así que cuando deseas comunicarte con otro programa por Internet, vas a tener que hacerlo a través de un descriptor de archivo, mejor que lo creas. Donde consigo este descriptor de archivo para comunicación de Red, Mr. Capo? es probablemente la última pregunta en tu cerebro, pero la voy a responder igual: Haces una llamada a la rutina de sistema socket(). Ésta devuelve el descriptor del socket, y te comunicas a través de el usando las funciones especializadas send() y recv(). Pero, oye!,debes estar gritando ahora, Si es un descriptor, porque en el nombre de Linus no puedo usar las llamadas read() y write() para comunicarme a través del socket? La respuesta simple es: Sí puedes! La respuesta real sería: Puedes, pero send() y recv() ofrecen un mejor control sobre tu transmisión de datos. Qué sigue? Que tal esto: hay todo tipo de sockets. Están las direcciones de Internet DARPA (sockets de Internet), nombres de ruta en un nodo local (sockets de Unix), direcciones CCITT X.25 (sockets X.25 que se pueden ignorar), y probablemente muchos otros dependiendo en que sabor de Unix estás. Este documento trabaja con el primero: Sockets de Internet Dos tipos de Sockets de Internet Qué es esto? Hay dos tipos de socket en Internet? Si. Bueno... no. Estoy mintiendo. Hay más, pero no quiero asustarte. Sólo voy a hablar de dos tipos aquí. Pero debo decirte que los Raw Sockects son muy poderosos y deberías echarle una ojeada. Todo bien hasta ahora. Pero cuales son los dos tipos? Uno es Stream Sockets (Sockets de Flujo) y el otro Datagram Sockets, a los que nos referiremos como SOCK_STREAM Y SOCK_DGRAM, respectivamente. Los SOCK_DGRAM son a veces llamados sockets sin conenxion. Los stream sockets son flujos confiables de comunicación de dos-vías. Si mandas dos ítem por el socket en el orden 1, 2, ellos llegarán en el orden 1, 2 al otro lado. También estarán libres de error. Cualquier error que encuentres son producidos por tu propia mano, y no serán discutidos aquí. 7

8 Porqué usar stream sockets? Bueno, debes haber escuchado de las aplicaciones telnet, si?... Ocupa stream sockets. Todos los caracteres que tipeas necesitan llegar en el mismo orden en que los mandaste, correcto? Además, los navegadores web usan el protocolo HTTP el que usa stream sockets para obtener las páginas. De hecho, si tu haces telnet a un sitio en el puerto 80, y tipeas GET /, te arrojará el código html. Cómo los stream sockets mantienen la alta calidad de esta transmisión de datos? Ellos usan un protocolo llamado Protocolo de Control de Transmisión, conocido como TCP (ve RFC-793 para detalles). TCP se asegura de que tus datos lleguen secuencialmente y libre de errores. Debes haber escuchado acerca de TCP antes en TCP/IP donde IP es Protocolo de Internet (RFC-791). IP trata primeramente el rutamiento en Internet y no se responsabiliza por la integridad de los datos. Cool. Que pasa con los Datagram sockets? Por qué son llamados sockets sin conexión? Qué onda? Por qué no son confiables? Bueno, he aquí algunos hechos: si envías un datagram, puede que llegue. Puede llegar desordenado. Si llega, los datos del paquete estarán libres de errores. Datagram sockets también usan IP para el rutamiento, pero ellos no usan TCP; ellos usan Protocolo de Datagramas de Usuario o UDP (RFC-768). Por qué sin conexión? Bueno, básicamente, es porque no tienes que mantener una conexión abierta como con stream sockets. Tu sólo construyes un paquete, le pegas un encabezado IP con la información del destino, y lo mandas. Son generalmente usados para transferencia de información paquete por paquete. Algunas aplicaciones son: tftp, bootp, etc. Suficiente! puedes gritar. Como van a funcionar estos programas si los datagramas se pierden? Bueno, amigo mortal, cada uno tiene su propio protocolo en la cima del UDP. Por ejemplo, el protocolo tftp dice que por cada paquete enviado, el receptor debe enviar un paquete de vuelta que diga, Lo tengo (un paquete ACK ). Si el que envía el paquete original no tiene respuesta en, digamos, 5 segundos, el retransmitirá el paquete hasta que finalmente le llegue un ACK. Este conocido procedimiento es muy importante cuando implementamos aplicaciones SOCK_DGRAM Cosas de Bajo Nivel y Teoría de Red Ya que hemos nombrados los protocolos, es hora de hablar de cómo funciona realmente un red, y mostrar algunos ejemplos de cómo los paquetes SOCK_DGRAM son construidos. Seguramente te podrías saltar esta sección, pero nunca está de más aprender. Hey, niños, es hora de aprender sobre Encapsulación de datos! Esto es muy importante. Es tan importante que podrías encontrar una carrera entera sobre esto aquí en el Estado de Chico. Básicamente dice esto: un paquete nace, el paquete es envuelto ( encapsulado ) en un encabezado (y raramente al final) por el primer protocolo (digamos, TFTP), 8

9 Figura 1. Encapsulación de Datos luego todo (el encabezado TFTP incluido) es encapsulado de nuevo por el siguiente protocolo (UDP, digamos), luego nuevamente por el siguiente (IP), luego de nuevo por el protocolo final el capa (física) de hardware (sea Ethernet). Cuando la otra computadora recibe el paquete, el hardware extrae el encabezado Ethernet, el kernel hace lo mismo con los encabezados UDP e IP, el programa TFTP extrae el encabezado TFTP, y al final sólo queda el dato. Ahora por fin puedo hablar de la infame Capa de modelo de Red. Esta describe un sistema de red que tiene muchas ventajas sobre otros modelos. Por ejemplo, tu puedes escribir programas de sockets que son exactamente iguales sin preocuparte de cómo se transfieren los datos físicamente (serial, thin Ethernet, AUI, como sea), ya que programas en niveles inferiores hacen el trabajo por ti. El hardware y la topología de red actuales son transparentes para el programador de sockets. Sin entrar en más, te presento las capas del hablado modelo. Recuerda esto para tu examen de Redes: Capa Física Capa de enlace Capa de Red Capa de Transporte Capa de Sesión Capa de Presentación Capa de Aplicación La Capa Física es el Hardware (serial, Ethernet, etc.). La Capa de Aplicación esta los más lejos de la Física, y como te puedes imaginar es el lugar donde los usuarios interactúan con la Red. Ahora, este modelo es tan general que lo podrías emplear para repara autos si quisieras.... Un modelo de capas más consistente con Unix sería más o menos: Capa de Aplicación (telnet, ftp, etc.) Capa de Transporte Host-to-Host (TCP, UDP) Capa de Internet (IP y rutamiento) Capa de Acceso a la Red (Ethernet, ATM, etc). En este punto, probablemente puedas ver como estas capas actúan en la encapsulación del dato original. Ves cuanto trabajo requiere construir un simple paquete? Y tienes que tipearlos tu mismo usando cat!.... No. Todo lo que tienes que hacer para los STREAM SOCKETS es 9

10 send() (enviar) los datos. El kernel construye la Capa de Transporte y de Internet por ti y el hardware se encarga de la Capa de Acceso de Red. OH!! Tecnología Moderna. Así termina nuestra corta expedición dentro de la Teoría de Red. Oh!, sí, se me olvido decirles todo lo que quería acerca del enrutamiento: nada! Así es, no voy a hablar para nada de ello. El router (ruteador) extrae el paquete del encabezado IP, consulta su tabla de ruteo, blah blah blah. Mira el IP RFC si realmente te interesa. Si nunca aprendes sobre eso, bueno, sobrevivirás. 10

11 3. STRUCTS y Manejo de Datos Por fin estamos aquí. Es tiempo de hablar sobre programación. En esta sección, cubriré varios tipos de datos ocupados por la interfaz de sockets, ya que algunos son muy difíciles de deducir. Primero el fácil: un descriptor de socket. Un descriptor de socket es el siguiente: int Un regular int. Las cosas se pondrán raras ahora, así que lee todo y aguanta conmigo. Aprende esto: hay dos tipos de orden de byte: byte más importante primero (llamado a veces un octeto ), o el menos importante primero. Esta forma es llamada Red de Orden de Byte (Network Byte Order). Algunas máquinas guardan sus números internamente en este tipo de Red, otras no. Cuando digo que algo tiene que estar en Network Byte Order, tienes que llamar a una función (como htons() ) para cambiar de Host Byte Order. Si no digo nada, entonces debes dejar en Host Byte Order. (Para los curiosos Network Byte Order también se conoce como "Big-Endian Byte Order ). Mi primera estructura (Struct ) STRUCT SOCKADDR. Esta estructura mantiene información de las direcciones de sockets para varios tipos de estos: struct sockaddr { unsigned short sa_family; // dirección de familia, AF_xxx char sa_data[14]; // 14 bytes de protocolo de dirección ; sa_family puede ser una variedad de cosas, pero será AF_INET para todo lo que hagamos en este documento. sa_data contiene una dirección de destino y un número de puerto para el socket. Esto mas bien es poco manejable, ya que no querrás empaquetar la dirección en sa_data a mano. Para trabajar con STRUCT SOCKADDR, los programadores crearon una estructura paralela: STRUCT SOCKADDR_IN ( IN por Internet ). struct sockaddr_in { short int sin_family; // Familia de dirección unsigned short int sin_port; // Número de Puerto struct in_addr sin_addr; // Dirección de internet ; unsigned char sin_zero[8]; // Mismo tamaño que struct sockaddr Esta estructura facilita la referencia a elemento de dirección de socket. Nota que sin_zero (el cual es incluido para acomodar la estructura al largo de STRUCT SOCKADDR) debería ser establecido a todos los ceros (zeros) con la función memset(). Además, y este es un dato importante, un apuntador a STRUCT SOCKADDR_IN puede lanzar un puntero a STRUCT SOCKADDR y vise-versa. Así que incluso si socket() necesita un STRUCT SOCKADDR*, puedes aún usar STRUCT SOCKADDR_ IN y ponerlo en el último minuto! Además, nota que 11

12 SIN_FAMILY corresponde a sa_family en STRUCT SOCKADDR_IN y debería tomar el valor de AF_INET. Finalmente, SIN_PORT y SIN_ADDR deben ser Network Byte Order! Pero, dices. Como toda la estructura, STRUCC IN_ADRR SIN_ADDR, puede estar en NBT (Network Byte Order)? Esta pregunta requiere un profundo análisis de la estructura STRUCC IN_ADRR, una de las peores uniones vivas: // Internet address (una estructura de razonos históricas) struct in_addr { unsigned long s_addr; ; Bueno, solían estar unidos, pero en estos días parece que ha desaparecido. Una buena pérdida. Así que si has declara ina del tipo STRUCT SOCKADDR_ IN, luego ina.sin_addr.s_addr hace referencia a la dirección IP de 4 byte (en NBT). Nota que si tu sistema aun usara STRUCC IN_ADRR, igual puede indicar la dirección IP de 4 byte exactamente de la misma forma que lo hicimos arriba (gracias a #defne) Convirtiendo a los Nativos! Hemos sido conducidos justo a la próxima sección. Se ha hablado mucho acerca de la conversión de NBO a HBO (Host Byte Order), ahora es tiempo de actuar. Bien. Hay dos tipos que puedes convertir: short (2 bytes) y long (4 bytes). Estas funciones también funcionan para la variante unsigned. Digamos que quieres convertir un short de HBO a NBO. Comienza con h por host, sigue con to, luego n de network, y s de short : h-to-n-s, o htons() (se lee: Host to Network Short, Short de Host a Red). Es casi demasiado fácil. Puedes hacer cualquier combinación que quieras usando: n, h, s y l, exceptuando las estúpidas. Por ejemplo, no existe la función stolh() ( Short to Long Host ), hasta ahora. Pero están: htons() Host a Red Short. htonl() Host a Red Long. ntohs() Red a Hosto Short. ntohl() Red a Host Long. Ahora debes creer que te estás poniendo al tanto. Puedes pensar, Qué hago si tengo que cambiar el orden de los bytes en un char? Luego dices, Uh, no importa. También puedes creer que como tu máquina ya usa NBT, no tienes que llamar a htonl() en tu dirección IP. Deberías estar en lo correcto, pero si tratas de portar un programa a una máquina que tiene un NBT inverso, tu programa fallará. Se portable! Este es un mundo Unix! (Por más que Bill Gates quiera pensar de otra manera). Recuerda: Pone tus bytes en NBT antes de ponerlos en la Red. Un punto final: por qué SIN_ADDR y SIN_PORT necesitan estar en NBT en STRUCT SOCKADDR_IN, pero SIN_FAMILY no? La respuesta es: SIN_ADDR y SIN_PORT son 12

13 encapsulados en el paquete en las capas IP y UDP, respectivamente. Por eso, ellos necesitan estar en NBT. Por otro lado, el campo SIN_FAMILY es sólo usado por el kernel para determinar que tipo de dirección contiene la estructura, así que debe estar en HBO. Además, ya que SIN_FAMILY nos es enviada a la red, puede estar en HBO Direcciones IP y como lidiar con ellas Afortunadamente para ti, hay un montón de funciones que permiten manipular direcciones IP. No hay que deducirlas a mano y embutirlas en un long con el operador «. Primero, digamos que tienes una estructura STRUCT SOCKADDR_IN INA, y la dirección IP de deseas guardar en ella. La función que deseas usar, inet_adrr(), convierta la dirección una dirección IP en la forma números-y-puntos a la forma de un entero largo (long) sin firmar. La transformación se puede hacer como sigue: ina.sin_addr.s_addr = inet_addr(" "); Fíjate que inet_addr() devuelve la dirección en NBT lista, no tienes que llamar a htonl(). Genial! Ahora, el código de arriba no es muy robusto porque no hay comprobación de errores. Mira, inet_addr() devuelve 1 en error. Te acuerda de los binarios? (unsigned) -1 sucede que corresponde a la dirección IP ! Esa es la dirección de transmisión! Mal, mal. Recuerda hacer tu comprobación de errores como corresponde. En realidad, hay una manera más fácil en vez de usar inet_addr():, se llama inet_aton() ( aton significa ASCII a Red ): #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int inet_aton(const char *cp, struct in_addr *inp); He aquí un ejemplo de su uso al empaquetar un STRUCT SOCKADDR_IN (este ejemplo tendrá mucho más sentido cuando llegues a la sección de bind() y connect()). STRUCT SOCKADDR_in my_addr; my_addr.sin_family = AF_INET; // host byte order my_addr.sin_port = htons(myport); // short, network byte order inet_aton(" ", &(my_addr.sin_addr)); memset(&(my_addr.sin_zero), \0, 8); // zero the rest of the struct inet_aton(), en contraste con las otras funciones de sockets, devuelve un valor no cero cuando es exitosa, y cero cuando falla. (Si alguien sabe porque, por favor dígame). Y la dirección es devuelta en inp. Desafortunadamente, no todas las plataformas implementan inet_aton(), aunque es preferible usarlo. Pero en esta guía ocuparemos inet_addr(). 13

14 Ok, ahora puedes convertir cadenas de direcciones IP en su representación binaria. Pero como lo hacemos al revés? Qué tal si tenemos un struct IN_ADDR y lo queremos escribir en notación de números-y-puntos? En este caso, tu querrás usar la función inet_ntoa() ( ntoa significa red a ascii ), como sigue: printf("%s", inet_ntoa(ina.sin_addr)); Eso escribirá la dirección IP. Nota que inet_ntoa() toma STRUCT IN_ADDR como un argumento, no como long. Además hay que destacar que devuelve un puntero a un char. Este apunta a un arreglo char que contiene inet_ntoa(), así que cada vez que llames a inet_ntoa(), este borrará la ultima dirección IP por la que preguntaste. Por ejemplo: char *a1, *a2;.. a1 = inet_ntoa(ina1.sin_addr); // this is a2 = inet_ntoa(ina2.sin_addr); // this is printf("address 1: %s\n",a1); printf("address 2: %s\n",a2); Esto imprimirá: address 1: address 2: Si necesitas guardar las direcciones, haz tu propio arreglo. Eso es todo por ahora. Más tarde, aprenderás a convertir una cadena del tipo whitehouse.gov a su dirección IP correspondiente. (busca sobre DNS, más abajo). 14

15 4. Llamadas al sistema. Esta es la sección donde nos meteremos en las llamadas de sistema que permiten acceder a la funcionalidad de la Red en una máquina Unix. Cuando llamas a una de estas funciones, el kernel toma el control y hace todo el trabajo por ti automagicamente. El lugar donde la mayoría de la gente queda atorada es en saber en que orden hacer las llamadas. En esto, las páginas man no son útiles, como debes haber descubierto. Bueno, en orden de ayudarlos, en las siguientes secciones las llamadas han sido hechas en exactamente (aproximadamente) el mismo orden que tú necesitarás llamarlas en tus programas. Eso, acompañado con unos pocos códigos de ejemplo por aquí y allá, algo de leche y galletas (lo cual confío que puedes obtener por ti solo(a)), y un poco de agallas y coraje, y estarás irradiando mensajes por Internet como el hijo de Juan Cartero! 4.1. socket() Consigue el Descriptor de Archivo! Supongo que no puedo atrasarlo más, tengo que hablar sobre la llamada a sistema socket(). He aquí: #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); Pero, que son esos argumentos? Primero, domain debería ser "AF_INET", justo como en STRUCT SOCKADDR_in (arriba). El siguiente, el argumento type, le dice al kernel que tipo de socket es: SOCK_STREAM o SOCK_DGRAM. Finalmente, sólo dele el valor 0 a protocol para que socket() escoja el protocolo correcto basado type. (Observación: hay muchos más domains y también hay mas types de los que he nombrado. Mira la página man socket(). Además hay una mejor manera de dar valor a protocol. Ve la página man getprotobyname() ). socket() simplemente te devuelve un descriptor de socket que puedes usar en llamadas a sistemas posteriores, o -1 en error. La variable global errno toma el valor del error (ve la página man de perror() ). Bien, pero, en qué ayuda esto? La respuesta es que por si solo no ayuda en nada, y necesitas leer más y hacer más llamadas a sistema para que tome sentido bind() - En que puerto estoy? Una vez que tienes un socket, deberías tener que asociarlo a algún puerto en tu máquina local. (Esto se hace comúnmente si vas a escuchar (listen() ) por conexiones entrantes en un puerto específico, cuando te hagan telnet a x.y.z puerto 6969 ). El número del puerto es usado por el kernel para asociar un paquete entrante con algún proceso descriptor de 15

16 socket. Si sólo te vas a conectar (connect() ), esto puede se innecesario. Léelo de todas maneras. Esta es un avance de la llamada al sistema bind(): #include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, struct sockaddr *my_addr, int addrlen); sockfd es descriptor de archivo de socket devuelto por socket(). my_addr es un puntero a STRUCT SOCKADDR que contiene información sobre tu dirección, es decir, puerto y dirección IP. addrlen puede ser sizeof (STRUCT SOCKADDR). Uf! Es mucho que tragar de una mascada. Veamos un ejemplo: #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define MYPORT 3490 main() { int sockfd; struct sockaddr_in my_addr; sockfd = socket(af_inet, SOCK_STREAM, 0); // haz un poco de correción de error! my_addr.sin_family = AF_INET; // host byte order my_addr.sin_port = htons(myport); // short, network byte order my_addr.sin_addr.s_addr = inet_addr(" "); memset(&(my_addr.sin_zero), \0, 8); // zero the rest of the struct // don t forget your error checking for bind(): bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));... De esto hay que decir unas pocas cosas: my_addr.sin_port está en NBO. También my_addr.sin_addr.s_addr. Otra cosa que debemos chequear es que los encabezados del programa pueden variar de sistema a sistema. Para estar seguro, deberías mirar tus páginas man. Por último, sobre bind(), debería mencionar que algunos procesos para identificar tu propia dirección IP y / o puerto, pueden ser automatizados: my_addr.sin_port = 0; my_addr.sin_addr.s_addr = INADDR_ANY; // escoge un puerto libre al azar // usa mi dirección IP Mira, al setear SETTING MY_ADDR.SIN_PORT a cero, le estas diciendo a bind() que escoja el puerto por ti. De la misma manera, al setear my_addr.sin_addr.s_addr a INADDR_ANY, le estás diciendo que automáticamente llene la dirección IP con la que tiene tu PC. Si eres minucioso, puede que te hallas dado cuenta que un puse INADDR_ANY en NBO! Que pillo soy. Como sea, tengo que INADDR_ANY es realmente cero! Cero tendrá cero bits aun cuando reordenes los bytes. Aunque, los cuáticos dirán que podría haber una 16

17 dimensión paralela donde INADDR_ANY es, digamos, 12 y mi código no funcionaría. Esta bien para mi: my_addr.sin_port = htons(0); // escoge un puerto libre al azar my_addr.sin_addr.s_addr = htonl(inaddr_any); // usa mi dirección IP Ahora somos tan portables que probablemente no lo creas. Sólo quería señalar eso, ya que en la mayoría del código que encontrarás no importa correr INADDR_ANY a través de htonl(). Además bind() devuelve -1 en error y setea errno con el valor de error. Otra cosa que resaltar cuando se llama a bind(): no ocupes números de puerto muy pequeños. Todos los puertos hasta 1024 están reservados (a menos que seas el súperusuario)! Puedes ocupar cualquier puerto sobre ése, hasta (si no están siendo ocupados por otro programa). Algunas veces, algunas, quieras reiniciar un programa servidor (server) y bind() falla, reclamando la dirección ya se esta usando. Qué significa eso? Bueno, un bit de un socket que estaba conectado anda dando vueltas por el kernel, y está ocupando el puerto. Puedes hacer dos cosas: esperar a que se desocupe (un minuto más o menos), o añadir un código a tu programa para que se pueda reutilizar el puerto, así: int yes=1; // lose the pesky "Address already in use" error message if (setsockopt(listener,sol_socket,so_reuseaddr,&yes,sizeof(int)) == -1) { perror("setsockopt"); exit(1); Una pequeña nota final sobre bind(): habrán veces en que no lo llamarás para nada. Si te esta conectando (connect() ) a una máquina remota y no te importa cual es tu puerto local (este es el caso con telnet cuando sólo importa el puerto remoto), tu simplemente puedes llamar a connect(), éste chequeará si el socket está disponible, y hará bind() a un puerto libre si es necesario connect() Hey, tú! Pretendamos por algunos minutos que eres una aplicación del telnet. Tu usuario te ordena (como en la película Tron ) que adquieras un descriptor de archivo de socket. Tú cumples y llamas a socket(). Luego, el usuario te dice que te conectes a en el puerto 23 (el estándar para telnet). Yow! Qué haces ahora? Por suerte para ti, programa, tu estas ahora en la sección connect() como conectar con un host remoto. Así que lee furiosamente. No hay tiempo que perder! La llamada a connect() es como sigue: #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); 17

18 sockfd es nuestro amistoso vecino descriptor de archivo de socket, como devuelve la llamada socket(), serv_addr es un STRUCT SOCKADDR que contiene la dirección IP y puerto destino, y addrlen puede setearse a sizeof (STRUCT SOCKADDR). No empieza a tener más sentido? Veamos un ejemplo: #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define DEST_IP " " #define DEST_PORT 23 main() { int sockfd; struct sockaddr_in dest_addr; // contendrá la dirección de destino sockfd = socket(af_inet, SOCK_STREAM, 0); // do some error checking! dest_addr.sin_family = AF_INET; // host byte order dest_addr.sin_port = htons(dest_port); // short, network byte order dest_addr.sin_addr.s_addr = inet_addr(dest_ip); memset(&(dest_addr.sin_zero), \0, 8); // zero the rest of the struct // don t forget to error check the connect()! connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));... Nuevamente, asegúrate de chequear el valor devuelto por connect() este devolverá un -1 en error y fijará la variable errno. Además, hay que decir que no llamamos a bind(). Básicamente, no nos preocupamos del número del puerto local; sólo nos interesa hacia donde vamos (el puerto remoto). El kernel escogerá el puerto local por nosotros, y el lugar donde nos conectamos recibirá automáticamente esta información de nosotros. No hay que preocuparse listen() - Alguien me llamaría por favor? Ok, tiempo para un cambio de lugar. Qué tal si no deseas conectarte a un host remoto. Digamos, sólo por decir, que deseas esperar una conexión entrante y manejarla de alguna manera. El consta de dos pasos: primero tu escuchas (listen() ), luego tu aceptas (accept() ). La llamada para escuchar es bastante simple, pero requiere una pequeña explicación: int listen(int sockfd, int backlog); sockfd es el descriptor de archivo de socket usual de la llamada al sistema socket(). backlog es el número de conexiones permitidas en la fila (como fila para el pan) entrante. Qué significa esto? Bueno, la conexiones entrantes van a esperar en esta fila hasta que las aceptes (accept() - mira abajo), y este es el límite de cuantas pueden estar en la fila. La mayoría de los sistemas limitan este número a 20; puedes salir del paso con 5 o

19 Nuevamente, como es usual, listen() devolverá un -1 en error y fijará la variable errno. Bueno, como seguramente imaginas, necesitamos llamar a bind() antes de listen() o el kernel nos tendrá escuchando en in puerto al azar. Entonces, si vas ha estar escuchando por llamadas entrantes, la secuencia de llamadas a sistema sería: socket(); bind(); listen(); /* accept() goes here */ Dejaré hasta aquí el código de ejemplo, ya que se explica casi solo. (El código de la sección accept() que sigue, es más completo). La parte realmente importante aquí es la llamada a accept() accept() - Gracias por llamar al puerto Prepárate la llamada accept() es un tanto rara! Lo que va a pasar es esto: alguien de bien, bien lejos tratará de connect() (conectarse) a tú máquina con un puerto que este escuchando (listen() ). La conexión del otro quedará en la fila esperando a ser aceptada (accept() ). Tu llamas a accept() y le dices que se comunique con la conexión pendiente. Éste te devolverá un descriptor de archivo de socket nuevecito para ocupar solamente en esta conexión! Así es, de pronto tienes dos descriptores de archivo de socket por el precio de uno! Él original todavía está escuchando en tu puerto y el nuevo está finalmente listo para send() (enviar) y recv() (recibir). Estamos listos! La llamada es como sigue: #include <sys/socket.h> int accept(int sockfd, void *addr, int *addrlen); sockfd es el descriptor de socket que escucha (listen() ). Suficientemente fácil. addr usualmente será un puntero a STRUCT SOCKADDR_IN. Aquí es donde la información de la conexión entrante irá (y con ella tu puedes determinar que host esta llamándote y de que puerto). addrl es una variable local entera que deberá tomar el valor de sizeof (STRUCT SOCKADDR_in) antes su dirección es pasada a accept(). accept no pondrá más bytes de lo que tiene en addr. Si pone menos, cambiará el valor de addrlen para reflejar el cambio. Adivina qué? accept() devolverá un 1 en error y fijará la variable errno. Apuesto a que no lo habías pensado. Como antes, esto es mucho que tragar de una sola mascada, así que aquí hay un código de ejemplo para tu estudio: #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #define MYPORT 3490 // the port users will be connecting to 19

20 #define BACKLOG 10 // how many pending connections queue will hold main() { int sockfd, new_fd; // escu7cha en sock_fd, nueva conexión en on new_fd struct sockaddr_in my_addr; // información de mi dirección struct sockaddr_in their_addr; // información de la dirección del otro int sin_size; sockfd = socket(af_inet, SOCK_STREAM, 0); // do some error checking! my_addr.sin_family = AF_INET; // host byte order my_addr.sin_port = htons(myport); // short, network byte order my_addr.sin_addr.s_addr = INADDR_ANY; // se llena con mi IP memset(&(my_addr.sin_zero), \0, 8); // zero the rest of the struct // don t forget your error checking for these calls: bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)); listen(sockfd, BACKLOG); sin_size = sizeof(struct sockaddr_in); new_fd = accept(sockfd, &their_addr, &sin_size);... Nuevamente, fíjate que usaremos el descriptor de socket new_fd para todas las llamadas send() y recv(). Si casi siempre solamente tienes una conexión, puedes close() (cerrar) el sockfd que está escuchando en orden de prevenir más llamadas al mismo puerto, si lo deseas send() y recv() - Háblame, baby! Estas dos funciones son para comunicarse sobre stream socket o datagram sockets conectados. Si desean usar datagran sockets desconectados, necesitarás ver la sección siguiente de sendto() y recvfrom(). La llamada send(): int send(int sockfd, const void *msg, int len, int flags); sockfd es el descriptor de socket donde deseas enviar data (ya sea el que es devuelto por socket() o el que obtienes con accept() ). msg es un puntero al dato que deseas enviar, y len sería el largo del dato en bytes. Sólo setea flags a 0. (Ve la página man de send() para más información concerniente a flags). Este puede ser un código de ejemplo: char *msg = "Beej was here!"; int len, bytes_sent;.. len = strlen(msg); 20

21 bytes_sent = send(sockfd, msg, len, 0);... send() devuelve el número de bytes que en realidad salieron puede ser menos que el número que le indicaste que enviara! Mira, algunas veces le ordenas que envié un monton de datos que simplemente no puede controlar. El lanzará la mayor cantidad de data que pueda, y confiará en que tú enviarás el resto después. Recuerda, que si el valor devuelto por send() no concuerda con el valor de len, depende de ti enviar el resto de la cadena. La buena noticia es esta: si el paquete es pequeño (menos de 1K) probablemente será enviado en un solo paso. Nuevamente, devolverá un 1 en error y fijará la variable errno con el número de error. La llamada recv() es similar en muchos aspectos: int recv(int sockfd, void *buf, int len, unsigned int flags); sockfd es el descriptor de socket del cual leeremos, buf es el buffer (espacio de memoria para almacenamiento temporal de datos) para leer la información, len es el largo máximo del buffer, y flags nuevamente puede tomar el valor 0. recv() devuelve el número de bytes que realmente se leen en el buffer, o -1 en error (con errno seteado, como corresponde). Espera! recv() puede devolver 0. Esto puede significar sólo una cosa: el lado remoto ha cerrado la conexión contigo! Recibir un valor 0 es como dejarte saber que esto ha ocurrido. Eso fue fácil, o no? Ahora puedes pasar data de ida y vuelta en stream sockets! Bien! Eres un programador de Redes Unix! 4.7. sendto() y recvfrom() Háblame, al estilo DGRAM! Esto está bacán. Estas diciendo. Pero donde me deja con los datagram sockets desconectados?. No hay problema, amigo. Tenemos la manera. Ya que los datagram sockets no están conectados a un host remoto, adivina que pieza de información debemos dar antes de enviar el paquete? Eso es correcto! La dirección de destino! He aquí la cuchara: int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen); Como puedes ver, esta llamada es básicamente igual a send() con la adición de dos piezas de información. to es un puntero a STRUCT SOCKADDR (el cual probablemente tendrás como STRUCT SOCKADDR_in y llamarás en el último minuto) que contiene la dirección IP y el puerto de destino. tolen puede ser simplemente seteado a sizeof (STRUCT SOCKADDR). 21

22 Igual que con send(), sendto() devuelve el número de bytes que se envían en realidad (el cual, nuevamente, puede ser menor que el número de bytes que habías indicado!), o -1 en error. Igualmente similares son recv() y recvfrom(). La forma de recvform() es: int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen); Nuevamente, esto es como recv() con la adición de una pareja de campos. from es puntero a un STRUCT SOCKADDR local que será llenado con la dirección IP y el puerto de la máquina de origen. fromlen es un puntero a un int (variable entera) local que debería ser iniciada en sizeof(struct SOCKADDR). Cuando la función vuelva, fromlen contendrá el largo de la dirección actualmente guardad en from. recvfrom() devuelve el número de bytes recibido, o -1 en error (con errno evaluado acordemente). Recuerda, si tu connect() un datagram socket, puedes simplemente usar send() y recv() para todas tus transacciones. El socket en si es aún un datagram socket y los paquetes aún usarán UDP, pero la interfaz de socket añadirá automáticamente el destino y fuente de información, por ti close() y shutdown() Sale de mi vista! Bien! Has estado send()ing (enviando) y recv()ing (recibiendo) datos durante todo el día, y te has cansado de ello. Entonces estás listo para cerrar la conexión de tu descriptor de socket. Esto es fácil. Puedes usar el descriptor Unix: la función close(). close(sockfd); Esto no permitirá que se escriba o lea en el socket. Cualquiera que intente leer o escribir remotamente en el socket recibirá un error. Sólo en el caso de que desees un poco más de control sobre como cerrar el socket, puedes usar la función shutdown(). Ésta te permite cortar la comunicación en cierta dirección, o en ambas (igual que close() ). Y es: int shutdown(int sockfd, int how); sockfd es el descriptor de archivo de socket que deseas apagar (shutdown), y how puede tomar los siguientes valores: 0 Recibir está deshabilitado. 1 Enviar está deshabilitado. 2 Enviar y Recibir están deshabilitados (como close() ) shutdown() devolverá 0 cuando sea exitoso, y -1 en error (con errno ajustado acordemente). 22

23 Si tratas de usar shutdown() en datagram sockets desconectados, simplemente hará que el socket esté indispuesto para las llamadas send() (enviar) y recv() (recibir) (recuerda que puedes usar esto si connect() tus datagram socket). Es importante notar que shutdown() en realidad no cierra el descriptor de archivo solamente cambia su disponibilidad. Para liberar un descriptor de socket, necesitas usar close(). Nada más getpeername() Quién eres? Esta función es muy fácil. Están fácil que casi no le doy una sección. Pero aquí está de todas maneras. Las función getpeername() te dirá quien esta conectado al final del stream socket. Es así: #include <sys/socket.h> int getpeername(int sockfd, struct sockaddr *addr, int *addrlen); sockfd es el descriptor del stream socket conectado, addr es el puntero a STRUCT SOCKADDR (o STRUCT SOCKADDR_in) que contendrá la información acerca del otro lado de la conexión, y addrlen es un puntero a un int, que debería ser inicializado a sizeof(struct SOCKADDR). La función devuelve -1en error y registra errno adecuadamente. Una vez que tienes su dirección, puedes usar inet_ntoa() o gethostbyaddr() para escribir u obtener más información. No, no puedes obtener su nombre de usuario. (Ok, ok. Si la otra computadora está corriendo un demonio ident, es posible. Esto, de todas maneras, no es parte de este documento. Chequea el RFC para más información) gethostname() Quién diablos soy? Incluso más fácil que getpeername() es la función gethostname(). Ésta devuelve el nombre de la computadora donde está corriendo tu programa. El nombre puede ser usado por gethostbyname(), abajo, para determinar la IP de tu máquina local. Qué puede ser más entretenido? Bueno, hay algunas cosas, pero no tienen que ver con la programación de sockets. Ok, así se hace: #include <unistd.h> int gethostname(char *hostname, size_t size); Los argumentos son simples: hostname es un puntero a un arreglo que contendrá el nombre del host que devolvió la función, y size es el largo en bytes del arreglo hostname. 23

24 La función devuelve 0 cuando se completa bien, y -1 en error, seteando errno como es usual DNS Tú dices whitehouse.gov, Yo digo En caso que no sepas que es DNS, quiere decir Servicio de Nombre de Dominio ( Domain Name Service, por sus siglas en inglés). De modo fácil, tu le das la dirección humanamente legible de un sitio, y él (DNS) te da la dirección IP (para que las uses con bind(), connect(), sendto(), o para lo que sea que la necesites). De esta manera, cuando alguien escriba: $ telnet whitehouse.gov telnet podrá encontrar la manera para conectarse a Pero, cómo funciona? Estarás usando la función gethostbyname(): #include <netdb.h> struct hostent *gethostbyname(const char *name); Como ves, devuelve un puntero a STRUCT HOSTENT. A continuación se muestra como es: struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; ; #define h_addr h_addr_list[0] Siguiendo se muestra la descripción de los campos en struct hostent: h_name Nombre oficial de Host. h_aliases Un arreglo NULL de nombres alternativos para el host. h_addrtype El tipo de dirección que se devuelve; usualmente AF_INET. h_length El largo de la dirección en bytes. h_addr_list Un arreglo terminado en cero de las direcciones para el host. Las direcciones del host están en NBO. h_addr La primera dirección en h_addr_list. gethostbyname() devuelve un puntero al ocupado struct hostent, o NULL en error (Pero errno no toma valor, h_errno lo hace en su lugar. Ve herror(), más abajo). Pero cómo se usa esto? Algunas veces (como encontramos cuando leemos manual de computador), lanzar información al lector no es suficiente. Esta función es mucho más fácil de lo que parece. He aquí un programa de ejemplo 10 : 24

25 /* ** getip.c - a hostname lookup demo */ #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { struct hostent *h; if (argc!= 2) { // error check the command line fprintf(stderr,"usage: getip address\n"); exit(1); if ((h=gethostbyname(argv[1])) == NULL) { // get the host info herror("gethostbyname"); exit(1); printf("host name : %s\n", h->h_name); printf("ip Address : %s\n", inet_ntoa(*((struct in_addr *)h->h_addr))); return 0; Con gethostbyname(), no puedes usar perror() para imprimir un mensaje de error (ya que errno no se usa). En vez, llama a herror(). Es bastante directo. Simplemente le pasas la cadena que contiene el nombre del host ( whitehouse.gov ) a gethostbyname(), y luego pesca la información que es devuelta por struct hostent. Lo único que podría resultar extraño es la escritura de la dirección IP. h->h_addr es un char*, pero inet_ntoa() requiere STRUCT IN_ADDR PASSED. Así que yo pongo h->h_addr en STRUCT IN_ADDR*, luego le hago deferencia para conseguir los datos. 25

26 5. Sistema Cliente-Servidor Este es un mundo Cliente-Servidor, baby. Casi todo lo que envuelve a la Red tiene que con procesos de cliente hablando con procesos de servidor, y vise-versa. Toma a telnet, por ejemplo. Cuando te conectas (tú cliente) con un host remoto al puerto 23, 26

27 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/wait.h> #include <signal.h> #define MYPORT 3490 // the port users will be connecting to #define BACKLOG 10 // how many pending connections queue will hold void sigchld_handler(int s) { wait(null); int main(void) { int sockfd, new_fd; // listen on sock_fd, new connection on new_fd STRUCT SOCKADDR_in my_addr; // my address information STRUCT SOCKADDR_in their_addr; // connector s address information int sin_size; struct sigaction sa; int yes=1; if ((sockfd = socket(af_inet, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); if (setsockopt(sockfd,sol_socket,so_reuseaddr,&yes,sizeof(int)) == -1) { perror("setsockopt"); exit(1); my_addr.sin_family = AF_INET; // host byte order my_addr.sin_port = htons(myport); // short, network byte order my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP bzero(&(my_addr.sin_zero), 8); // zero the rest of the struct if (bind(sockfd, (STRUCT SOCKADDR *)&my_addr, sizeof(struct SOCKADDR)) == -1) { perror("bind"); exit(1); if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); sa.sa_handler = sigchld_handler; // reap all dead processes sigemptyset(&sa.sa_mask); 27

28 sa.sa_flags = SA_RESTART; if (sigaction(sigchld, &sa, NULL) == -1) { perror("sigaction"); exit(1); while(1) { // main accept() loop sin_size = sizeof(struct SOCKADDR_in); if ((new_fd = accept(sockfd, (STRUCT SOCKADDR *)&their_addr, &sin_size)) == -1) { perror("accept"); continue; printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr)); if (!fork()) { // this is the child process close(sockfd); // child doesn t need the listener if (send(new_fd, "Hello, world!\n", 14, 0) == -1) perror("send"); close(new_fd); exit(0); close(new_fd); // parent doesn t need this return 0; En caso de que sean curiosos, yo tengo este código en una función main() bien grande para (por lo que a mi respecta) mantener la claridad de la sintaxis. Considérate libre de dividirla en funciones más pequeñas si te hace sentir mejor. (Además, todo esto de sigaction() puede ser nuevo para ti - lo cual está bien. El código presentado es responsable de recoger todos los procesos zombis que aparecen cuando el proceso hijo de fork() existe. Si haces un montón de procesos zombis y no los recojes, tu administrador de sistema se estremecerá.) Puedes obtener datos de este servidor usando el cliente mostrado en la próxima sección Un simple Cliente de flujo Esto es más fácil que el servidor. Todo lo que estos clientes hacen es conectarse con el host que especificas en la línea de comando, puerto Y recibe la cadena que envía el servidor. 28

29 La fuente del cliente 12 : /* ** client.c - a stream socket client demo */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #define PORT 3490 // the port client will be connecting to #define MAXDATASIZE 100 // max number of bytes we can get at once int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[maxdatasize]; struct hostent *he; STRUCT SOCKADDR_in their_addr; // connector s address information if (argc!= 2) { fprintf(stderr,"usage: client hostname\n"); exit(1); if ((he=gethostbyname(argv[1])) == NULL) { // get the host info perror("gethostbyname"); exit(1); if ((sockfd = socket(af_inet, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); their_addr.sin_family = AF_INET; // host byte order their_addr.sin_port = htons(port); // short, network byte order their_addr.sin_addr= *((struct in_addr *)he->h_addr); bzero(&(their_addr.sin_zero), 8); // zero the rest of the struct if (connect(sockfd, (STRUCT SOCKADDR *)&their_addr, sizeof(struct SOCKADDR)) == -1) { perror("connect"); exit(1); 29

30 if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { perror("recv"); exit(1); buf[numbytes] = \0 ; printf("received: %s",buf); close(sockfd); return 0; Observa que si no corres en servidor antes que el cliente, connect() devolverá Connection refused. Muy útil Datagram Sockets Realmente no tengo mucho de que hablar aquí, por ende sólo presentaré algunos programas de ejemplo: talker.c y lintener.c. listener se estanca en una máquina esperando por un paquete entrante en el puerto talker envía un paquete a ese puerto, en la máquina especificada, que contiene lo que sea que el usuario tipee en la línea de comando. Este es el código de listener.c 13 : /* ** listener.c - a datagram sockets "server" demo */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define MYPORT 4950 // the port users will be connecting to #define MAXBUFLEN 100 int main(void) { 30

PROGRAMACIÓN CON SOCKETS

PROGRAMACIÓN CON SOCKETS UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INGENIERÍA TELEMÁTICA PROGRAMACIÓN CON SOCKETS Celeste Campo Carlos García Rubio {celeste,cgr}@it.uc3m.es PROGRAMACIÓN CON SOCKETS Pág. 1 1. Introducción.

Más detalles

Estructuras y funciones de programación de sockets.

Estructuras y funciones de programación de sockets. Estructuras y funciones de programación de sockets. Introducción. En estos apuntes se incluye una breve descripción de las estructuras y funciones cuyo uso puede ser necesario para el desarrollo de las

Más detalles

Introducción a la programación con sockets en C

Introducción a la programación con sockets en C Introducción a la programación con sockets en C Enrique Bonet Departamento de Informática Universidad de Valencia Índice Introducción Socket Creación de un socket Cierre de un socket Asociación de un socket

Más detalles

Qué es un socket? Dominios de comunicación. Tipos de sockets en el dominio AF_INET. Sockets Stream. Sockets Datagram. Sockets Raw

Qué es un socket? Dominios de comunicación. Tipos de sockets en el dominio AF_INET. Sockets Stream. Sockets Datagram. Sockets Raw Qué es un socket? Es una interfaz de entrada salida de datos que permite la intercomunicación entre procesos. Los procesos pueden estar ejecutándose en el mismo o en distintos sistemas, unidos mediante

Más detalles

Migrando aplicaciones a IPv6

Migrando aplicaciones a IPv6 Migrando aplicaciones a Fundamentos técnico: DualStack y Socket.h Alonso Sandoval A. Hernán Vargas L. Universidad Técnica Federico Santa María asandova@alumnos.inf.utfsm.cl, hvargas@alumnos.inf.utfsm.cl

Más detalles

Guía Beej de Programación en Redes

Guía Beej de Programación en Redes Guía Beej de Programación en Redes Uso de sockets de Internet Brian "Beej" Hall beej@piratehaven.org Copyright 1995-2001 por Brian "Beej" Hall Traducción al español a cargo de Damián Marqués Lluch

Más detalles

Mecanismos IPC: sockets

Mecanismos IPC: sockets Mecanismos IPC: sockets Ampliación de Sistemas Operativos (prácticas) E.U. Informática en Segovia Universidad de Valladolid Sockets Los sockets son una abstracción lógica que permiten la comunicación bidireccional

Más detalles

Introducción de Sockets en C.

Introducción de Sockets en C. PRÁCTICA 2: Introducción de Sockets en C. 1 La Interfaz Socket es una API para redes TCP/IP que se compone de funciones o rutinas. Originalmente se construyó a principios de los 80 para el sistema operativo

Más detalles

Problemas de Redes de Computadores. Conjunto de problemas 1

Problemas de Redes de Computadores. Conjunto de problemas 1 Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1 Pregunta 1.1: Si configuro mi servidor Web para que no acepte conexiones desde la dirección IP 130.206.1.1,

Más detalles

Sistemas Operativos: Programación de Sistemas. Curso 2006-07. Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Sistemas Operativos: Programación de Sistemas. Curso 2006-07. Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J. Tema 7 : Comunicación mediante sockets Sistemas Operativos: Programación de Sistemas Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J. Santana Pérez Curso 2006-07 Introducción Los sockets (también

Más detalles

Características de un lenguaje ideal para robótica

Características de un lenguaje ideal para robótica COMUNICACIÓN MEDIANTE SOCKETS Enrique Ortega Edrodoso Ingeniería Técnica de Informática de Gestión Introducción Los vehículos autoguiados comerciales disponibles en la actualidad tienen una serie de inconvenientes

Más detalles

COMUNICACIÓN ENTRE PROCESOS SOCKETS

COMUNICACIÓN ENTRE PROCESOS SOCKETS COMUNICACIÓN ENTRE PROCESOS SOCKETS Diseño de Sistemas Operativos Curso 2007/08 Grupo: Mi30 Martín Santana, A. David Martínez Santana, Luis Ignacio Qué son?(definición) n) Los sockets son mecanismos de

Más detalles

Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP. Laboratorio de Comunicación de Datos ITT Telemática Septiembre 2011

Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP. Laboratorio de Comunicación de Datos ITT Telemática Septiembre 2011 Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP Laboratorio de Comunicación de Datos ITT Telemática Septiembre 2011 Introducción Aplicaciones Distribuidas Su funcionalidad se distribuye

Más detalles

UNIVERSIDAD DE CANTABRIA DEPARTAMENTO DE INGENIERÍA DE COMUNICACIONES GRUPO DE INGENIERÍA TELEMÁTICA

UNIVERSIDAD DE CANTABRIA DEPARTAMENTO DE INGENIERÍA DE COMUNICACIONES GRUPO DE INGENIERÍA TELEMÁTICA UNIVERSIDAD DE CANTABRIA DEPARTAMENTO DE INGENIERÍA DE COMUNICACIONES GRUPO DE INGENIERÍA TELEMÁTICA MANUAL DE SOCKETS EN C TABLA DE CONTENIDOS Introducción.. 4 Sockets en C.. 7 2.1 Conceptos Básicos..

Más detalles

Sockets (TCP) Tema 2.- Nivel de aplicación en Internet

Sockets (TCP) Tema 2.- Nivel de aplicación en Internet Sockets (TCP) Tema 2- Nivel de aplicación en Internet Dr Daniel Morató es de Computadores Ingeniero Técnico en Informática de Gestión, 2º curso Material parcialmente adaptado del libro Computer Networking:

Más detalles

Boletín 7- Sockets. Departamento de Lenguajes y Sistemas Informáticos

Boletín 7- Sockets. Departamento de Lenguajes y Sistemas Informáticos Boletín 7- Sockets Departamento de Lenguajes y Sistemas Informáticos Indice 1. Introducción. 2. Tipos de sockets. 3. socket() 4. bind() 5. listen() 6. accept() 7. connect() 8. send()/ ()/recv(). 9. Funciones

Más detalles

BOLETIN 8 INDICE. ordenación de bytes. conversión de nombre y direcciones.

BOLETIN 8 INDICE. ordenación de bytes. conversión de nombre y direcciones. Sockets BOLETIN 8 INDICE 1. Introducción. 2. Tipos de sockets. 3. socket() 4. bind() 5. listen() 6. accept() 7. connect() 8. send()/recv(). 1. Funciones de ordenación de bytes 2. Funciones de conversión

Más detalles

Sockets (UDP) Tema 2.- Nivel de aplicación en Internet

Sockets (UDP) Tema 2.- Nivel de aplicación en Internet Sockets (UDP) Tema 2.- Nivel de aplicación en Internet Dr. Daniel Morató es de Computadores Ingeniero Técnico en Informática de Gestión, 2º curso Sockets y UDP UDP: no hay conexión entre cliente y servidor»

Más detalles

Programación con Sockets

Programación con Sockets Programación con Sockets INTRODUCCIÓN 1 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

Más detalles

Redes (IS20) Ingeniería Técnica en Informática de Sistemas. http://www.icc.uji.es. CAPÍTULO 8: El nivel de transporte en Internet

Redes (IS20) Ingeniería Técnica en Informática de Sistemas. http://www.icc.uji.es. CAPÍTULO 8: El nivel de transporte en Internet Redes (IS20) Ingeniería Técnica en Informática de Sistemas http://www.icc.uji.es CAPÍTULO 8: El nivel de transporte en Internet ÍNDICE 1. Introducción Curso 2002-2003 - Redes (IS20) -Capítulo 8 1 1. Introducción

Más detalles

Ingeniería Técnica de Telecomunicación, esp. Telemática Universidad de Jaén

Ingeniería Técnica de Telecomunicación, esp. Telemática Universidad de Jaén Contenido. Introducción Primitivas Sockets orientadas a conexión (TCP) Primitivas orientadas a no conexión (UDP) Programación con Sockets en Internet Funciones sockets Funciones auxiliares 1 Bibliografía.

Más detalles

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

En cualquier caso, tampoco es demasiado importante el significado de la B, si es que lo tiene, lo interesante realmente es el algoritmo. Arboles-B Características Los árboles-b son árboles de búsqueda. La "B" probablemente se debe a que el algoritmo fue desarrollado por "Rudolf Bayer" y "Eduard M. McCreight", que trabajan para la empresa

Más detalles

Diseño de aplicaciones distribuidas ÍNDICE

Diseño de aplicaciones distribuidas ÍNDICE Aplicaciones Distribuidas (s) Aplicaciones Distribuidas (s) TCP TCP Protocolos de Protocolos de Transporte Transporte UDP UDP STREAM STREAM (TCP) (TCP) SOCKET SOCKET Etapas en la Creación Etapas en la

Más detalles

Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1

Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1 Problemas de Redes de Computadores. Ingeniería Técnica en Informática de Gestión Conjunto de problemas 1 Preguntas cortas Pregunta 1.1: Si configuro mi servidor Web para que no acepte conexiones desde

Más detalles

Tema 4.1: - TRANSPORTE-

Tema 4.1: - TRANSPORTE- Tema 4.1: - TRANSPORTE- -Introducción - Terminología OSI - Tipologia y complejidad - Servicios - Calidad de servicio - Conexiones de transporte - Transporte en Internet - Introducción. Su función básica

Más detalles

QUÉ ES UN SERVIDOR Y CUÁLES SON LOS PRINCIPALES TIPOS DE SERVIDORES? (PROXY, DNS, WEB, FTP, SMTP, ETC.) (DV00408A)

QUÉ ES UN SERVIDOR Y CUÁLES SON LOS PRINCIPALES TIPOS DE SERVIDORES? (PROXY, DNS, WEB, FTP, SMTP, ETC.) (DV00408A) APRENDERAPROGRAMAR.COM QUÉ ES UN SERVIDOR Y CUÁLES SON LOS PRINCIPALES TIPOS DE SERVIDORES? (PROXY, DNS, WEB, FTP, SMTP, ETC.) (DV00408A) Sección: Divulgación Categoría: Herramientas Informáticas Fecha

Más detalles

Clase de Sockets en lenguaje C. Prof. Ricardo González

Clase de Sockets en lenguaje C. Prof. Ricardo González Clase de Sockets en lenguaje C Prof. Ricardo González 1 Modelo de Programación Cliente-Servidor Cliente: un programa que envía peticiones. Servidor: un programa que ofrece un servicio que satisface peticiones

Más detalles

TELEPROCESO Y SISTEMAS DISTRIBUIDOS

TELEPROCESO Y SISTEMAS DISTRIBUIDOS Universidad Nacional del Nordeste TELEPROCESO Y SISTEMAS DISTRIBUIDOS La Interfaz Socket Lic. Vanesa S. Roffé Año 2009 Introducción - Origen de la INTERFAZ SOCKET La Interfaz Socket es una API para redes

Más detalles

DESARROLLO DE APLICACIONES DISTRIBUIDAS. SOCKETS en UNIX

DESARROLLO DE APLICACIONES DISTRIBUIDAS. SOCKETS en UNIX DESARROLLO DE APLICACIONES DISTRIBUIDAS PRÁCTICAS CURSO 2002-2003 SOCKETS en UNIX 1. Los SOCKETS en OSI/ISO - Como ya conocéis, el modelo OSI/ISO estructura los diferentes elementos que conforman una red

Más detalles

Programación con sockets

Programación con sockets Programación con sockets Internetworking with TCP/IP Client/Server Programming and Applications: Linux/POSIX Sockets Version Douglas E. Comer David L. Stevens Capítulos: 2, 5, 7 Grupo de Sistemas y Comunicaciones

Más detalles

Adaptación de aplicaciones a IPv6

Adaptación de aplicaciones a IPv6 Adaptación de aplicaciones a IPv6 extensión de la interfaz de sockets Eva M. Castro ecastro@dit.upm.es Tutorial IPv6 -Adaptación de aplicaciones a IPv6 1 Contenido * Introducción Modelo de sockets BSD

Más detalles

INTRODUCCIÓN A LA PROGRAMACIÓN CON SOCKETS. Celeste Campo Carlos García Rubio

INTRODUCCIÓN A LA PROGRAMACIÓN CON SOCKETS. Celeste Campo Carlos García Rubio INTRODUCCIÓN A LA PROGRAMACIÓN CON SOCKETS Celeste Campo (celeste@it.uc3m.es) Carlos García Rubio (cgr@it.uc3m.es) PROGRAMACIÓN CON SOCKETS Pág. 1 ÍNDICE 1. Introducción. 2. API de sockets: Llamadas al

Más detalles

EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET

EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET 1 EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET La familia de protocolos TCP/IP fue diseñada para permitir la interconexión entre distintas redes. El mejor ejemplo es Internet: se trata

Más detalles

Analista Universtiario en Sistemas. Sistemas Operativos. IPC - Sockets SOCKETS

Analista Universtiario en Sistemas. Sistemas Operativos. IPC - Sockets SOCKETS SOCKETS Introducción Permiten la comunicación entre dos o más procesos ejecutando en un mismo equipo o equipos independientes La comunicación que posibilitan es full-duplex (bi-direccional) Sigue el modelo

Más detalles

Manual de Instalación y uso de FTP

Manual de Instalación y uso de FTP Manual de Instalación y uso de FTP Que es el FTP? El FTP es un sistema que nos permite de forma cómoda subir o bajar archivos a otra ubicación. Hay FTP públicos y privados, es decir en algunos todo el

Más detalles

-> Todo socket viene definido por dos características fundamentales:

-> Todo socket viene definido por dos características fundamentales: LOS SOCKETS. Los sockets no son más que puntos o mecanismos de comunicación entre procesos que permiten que un proceso hable (emita o reciba información) con otro proceso incluso estando estos procesos

Más detalles

SOCKETS en Linux. Lic. Leonardo de - Matteis. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 2011

SOCKETS en Linux. Lic. Leonardo de - Matteis. Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 2011 Introducción al uso de SOCKETS en Linux Lic. Leonardo de - Matteis Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur 2011 Interfaz de programación de aplicaciones NAPI

Más detalles

(decimal) 128.10.2.30 (hexadecimal) 80.0A.02.1E (binario) 10000000.00001010.00000010.00011110

(decimal) 128.10.2.30 (hexadecimal) 80.0A.02.1E (binario) 10000000.00001010.00000010.00011110 REDES Internet no es un nuevo tipo de red física, sino un conjunto de tecnologías que permiten interconectar redes muy distintas entre sí. Internet no es dependiente de la máquina ni del sistema operativo

Más detalles

Sockets: funcionamiento y programación. Sockets tipo UNIX. MSc. Ivan A. Escobar

Sockets: funcionamiento y programación. Sockets tipo UNIX. MSc. Ivan A. Escobar Sockets tipo UNIX MSc. Ivan A. Escobar Creación socket: socket() int socket(familia, tipo, protocolo) Regresa un valor entero Parecido descriptor de archivos: descriptor socket sockfd int familia familia

Más detalles

Base de datos en Excel

Base de datos en Excel Base de datos en Excel Una base datos es un conjunto de información que ha sido organizado bajo un mismo contexto y se encuentra almacenada y lista para ser utilizada en cualquier momento. Las bases de

Más detalles

SOCKET S. Alberto Castro Rojas

SOCKET S. Alberto Castro Rojas SOCKET S EL64E Alberto Castro Rojas 1 Interfaz de programación genérica Soporte de múltiples suites de protocolos de comunicación (familias) Representaciones de direcciones sin dependencias (endpoint)

Más detalles

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero. Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero. Uso de Ficheros Todas las estructuras de datos vistas hasta ahora utilizan la

Más detalles

Direcciones IP IMPLANTACIÓN DE SISTEMAS OPERATIVOS 1º ASIR. En redes IPv4.

Direcciones IP IMPLANTACIÓN DE SISTEMAS OPERATIVOS 1º ASIR. En redes IPv4. Direcciones IP En redes IPv4. IMPLANTACIÓN DE SISTEMAS OPERATIVOS Cada ordenador en Internet dispone de una dirección IP única de 32 bits. Estos 32 bits,o 4 bytes, se representan normalmente como se muestra

Más detalles

INSTALACION DEL Terminal Services. Instalamos el Terminal Services. Siguiente. Nos saldrá una advertencia, seleccionamos instalar.

INSTALACION DEL Terminal Services. Instalamos el Terminal Services. Siguiente. Nos saldrá una advertencia, seleccionamos instalar. INSTALACION DEL Terminal Services Instalamos el Terminal Services Siguiente Nos saldrá una advertencia, seleccionamos instalar Siguiente Seleccionamos todas y agregamos todas las funciones que hagan falta

Más detalles

ARQUITECTURA DE REDES Laboratorio PRÁCTICA 2: MANUAL DE SOCKETS EN C. Grado en Ingeniería Informática Curso 2014/15

ARQUITECTURA DE REDES Laboratorio PRÁCTICA 2: MANUAL DE SOCKETS EN C. Grado en Ingeniería Informática Curso 2014/15 ARQUITECTURA DE REDES Laboratorio PRÁCTICA 2: MANUAL DE SOCKETS EN C Grado en Ingeniería Informática Curso 2014/15 ÍNDICE 1. INTRODUCCIÓN.. 3 1.1 La familia de protocolos TCP/IP. 3 1.2 Nivel de red (IP)..

Más detalles

Covered California Créditos fiscales para Primas de Salud y Reconciliación de impuestos

Covered California Créditos fiscales para Primas de Salud y Reconciliación de impuestos Hoja de información OCTUBRE 2015 Covered California Créditos fiscales para Primas de Salud y Reconciliación de impuestos Resumen Podrías ser uno entre más de 1.2 millones de personas que compran seguros

Más detalles

Estructuras y funciones de programación de sockets.

Estructuras y funciones de programación de sockets. Estructuras y funciones de programación de sockets. Introducción. Autor: Enrique Bonet En estos apuntes se incluye una breve descripción de las estructuras y funciones cuyo uso puede ser necesario para

Más detalles

Programación Básica de Sockets en Unix para Novatos

Programación Básica de Sockets en Unix para Novatos Tabla de contenidos BracaMan Introducción...3 Diferentes tipos de sockets en Internet...3 Estructuras...3 Conversiones....5 Direcciones IP...5 Funciónes Importantes...6 Algunas palabras sobre dns...14

Más detalles

Sockets Básicos. Sockets Básicos

Sockets Básicos. Sockets Básicos Sockets Básicos Pedro Merino Gómez Jesus Martínez Cruz Dpto. Lenguajes y Ciencias de la Computación Universidad de Málaga Sockets Básicos Temas a tratar... APIS para acceso a TCP/IP El socket como descriptor

Más detalles

Capítulo 0. Introducción.

Capítulo 0. Introducción. Capítulo 0. Introducción. Bueno, por fin está aquí el esperado (espero!!) Capítulo Cero del Tutorial de Assembler. En él estableceremos algunos conceptos que nos serán de utilidad a lo largo del Tutorial.

Más detalles

7. Manejo de Archivos en C.

7. Manejo de Archivos en C. 7. Manejo de Archivos en C. Los datos que hemos tratado hasta el momento han residido en la memoria principal. Sin embargo, las grandes cantidades de datos se almacenan normalmente en un dispositivo de

Más detalles

Redes Locales: El protocolo TCP/IP

Redes Locales: El protocolo TCP/IP Redes Locales: El protocolo TCP/IP Los protocolos de red son las reglas que siguen los equipos conectados a la red para poder comunicarse entre sí, y hablar así el mismo idioma. El grupo de protocolos

Más detalles

INTERNET 4º ESO INFORMATICA / DEP. TECNOLOGIA

INTERNET 4º ESO INFORMATICA / DEP. TECNOLOGIA INTERNET 4º ESO INFORMATICA / DEP. TECNOLOGIA INTERNET Es una red mundial descentralizada, constituida por ordenadores que se conectan mediante un protocolo especial de comunicación, Internet Protocolo

Más detalles

Tema 4: Sockets: Un interfaz con TCP/IP

Tema 4: Sockets: Un interfaz con TCP/IP Tema 4: Sockets: Un interfaz con TCP/IP Introducción. Conceptos básicos. Dirección de un socket. Llamadas básicas de los sockets. Diferencias entre BSD-Sockets y WinSockets. Asignación de puertos a procesos.

Más detalles

UNIDAD 1. LOS NÚMEROS ENTEROS.

UNIDAD 1. LOS NÚMEROS ENTEROS. UNIDAD 1. LOS NÚMEROS ENTEROS. Al final deberás haber aprendido... Interpretar y expresar números enteros. Representar números enteros en la recta numérica. Comparar y ordenar números enteros. Realizar

Más detalles

PRACTICA CAPITULO 2 MODULO 1 PROTOCOLOS Y LA FUNCIONALIDAD DE LA CAPA DE APLICACIÓN

PRACTICA CAPITULO 2 MODULO 1 PROTOCOLOS Y LA FUNCIONALIDAD DE LA CAPA DE APLICACIÓN PRACTICA CAPITULO 2 MODULO 1 PROTOCOLOS Y LA FUNCIONALIDAD DE LA CAPA DE APLICACIÓN Los protocolos de capa de aplicación de TCP/IP más conocidos son aquellos que proporcionan intercambio de la información

Más detalles

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)

Unidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal) Unidad I Sistemas numéricos 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal) Los computadores manipulan y almacenan los datos usando interruptores electrónicos que están ENCENDIDOS o APAGADOS.

Más detalles

Aspectos Básicos de Networking

Aspectos Básicos de Networking Aspectos Básicos de Networking ASPECTOS BÁSICOS DE NETWORKING 1 Sesión No. 4 Nombre: Capa de transporte del modelo OSI Objetivo: Al término de la sesión el participante aplicará las principales características

Más detalles

Sockets Básicos. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. Temas a tratar...

Sockets Básicos. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. APIS para acceso a TCP/IP. Temas a tratar... Sockets Básicos Pedro Merino Gómez Jesus Martínez Cruz Dpto. Lenguajes y Ciencias de la Computación Universidad de Málaga Temas a tratar... Sockets Básicos El como descriptor para E/S Funciones básicas

Más detalles

Guía rápida de instalación Cámara CCTV-210

Guía rápida de instalación Cámara CCTV-210 Guía rápida de instalación Cámara CCTV-210 Ya conecté la cámara a mi MODEM, pero no veo nada. Qué puedo hacer? A continuación damos una guía sencilla y rápida para instalar las cámara dentro de una red

Más detalles

UTILIZANDO EL SQUIRREL MAIL

UTILIZANDO EL SQUIRREL MAIL UTILIZANDO EL SQUIRREL MAIL En la actualidad son varios los proveedores de alojamiento, que incluyen el squirrel mail como cliente de correo electrónico, así que vamos a darle una rápida mirada para aprender

Más detalles

Internet, conceptos básicos

Internet, conceptos básicos Internet, conceptos básicos IP (INTERNET PROTOCOL) Toda computadora tiene un número que la identifica en una red, este número es lo que llamamos IP, una dirección de IP típica se ve de esta manera Direcciones

Más detalles

REDES INFORMATICAS: Protocolo IP

REDES INFORMATICAS: Protocolo IP REDES INFORMATICAS: Protocolo IP 1. PRINCIPIOS BÁSICOS DE IP El protocolo IP se basa en tres principios básicos: Un direccionamiento de los ordenadores. Un tipo de dato: el datragrama IP. Un algoritmo

Más detalles

Unidad IV: TCP/IP. 4.1 Modelo Cliente-Servidor

Unidad IV: TCP/IP. 4.1 Modelo Cliente-Servidor Los usuarios invocan la parte cliente de la aplicación, que construye una solicitud para ese servicio y se la envía al servidor de la aplicación que usa TCP/IP como transporte. Unidad IV: TCP/IP 4.1 Modelo

Más detalles

Hablemos de RESULTADOS de los últimos años por un segundo. He estado:

Hablemos de RESULTADOS de los últimos años por un segundo. He estado: Te Gustaría que te Ayudara Personalmente a Crear Tu Negocio Digital en 30 días o a conseguir Más Clientes, Más Ingresos y Mejores Resultados en Tu Negocio Actual Completamente Gratis? Escrito de: Joan

Más detalles

3 Errores fatales que cometen muchos autónomos

3 Errores fatales que cometen muchos autónomos 3 Errores fatales que cometen muchos autónomos Hola! Que alegría me da que te hayas bajado este documento. Eso quiere decir que estas realmente comprometido a llevar tu negocio a una nueva dimensión. Una

Más detalles

Unidad I: La capa de Red

Unidad I: La capa de Red ARP El protocolo de resolución de direcciones es responsable de convertir las dirección de protocolo de alto nivel (direcciones IP) a direcciones de red físicas. Primero, consideremos algunas cuestiones

Más detalles

Curso de PHP con MySQL Gratis

Curso de PHP con MySQL Gratis Curso de PHP con MySQL Gratis Introducción Este mini curso o mini tutorial de PHP le ayudará a realizar cualquier sistema para que pueda insertar uno o varios registros a una base de datos con MySQL, este

Más detalles

ARQUITECTURAS CLIENTE/SERVIDOR

ARQUITECTURAS CLIENTE/SERVIDOR Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.Yasmine Macedo Reza 1 ARQUITECTURAS CLIENTE/SERVIDOR Conceptos básicos Arquitecturas Cliente/Servidor, Sem 2016-1 M.I.Yasmine Macedo Reza 2 Conceptos básicos

Más detalles

Acceder y administrar documentos en el servidor FTP por líneas de comandos

Acceder y administrar documentos en el servidor FTP por líneas de comandos Acceder y administrar documentos en el servidor FTP por líneas de comandos El objetivo de esta práctica es enseñarle al lector como poder accesar y administrar el servidor FTP por medio de la consola de

Más detalles

Gracias a ese IP único que tiene cada ordenador conectado a la red de internet se pueden identificar y comunicar los ordenadores.

Gracias a ese IP único que tiene cada ordenador conectado a la red de internet se pueden identificar y comunicar los ordenadores. COMO FUNCIONA INTERNET Internet es una gran red de ordenadores a nivel mundial, que pueden intercambiar información entre ellos. Se pueden comunicar porque están unidos a través de conexiones telefónicas,

Más detalles

HOW TO SOBRE REMOTE ACCESS VPN MODE EN LINUX

HOW TO SOBRE REMOTE ACCESS VPN MODE EN LINUX HOW TO SOBRE REMOTE ACCESS VPN MODE EN LINUX 1- En este how to realizaremos una conexión remota mediante vpn; lo que haremos es comprobar primero que las maquinas que vamos a conectar, se puedan ver y

Más detalles

Cómo sabes si tus esfuerzos en Social Media te están dando resultados? Para eso hay que medir, y Google Analytics ha venido a ayudarnos.

Cómo sabes si tus esfuerzos en Social Media te están dando resultados? Para eso hay que medir, y Google Analytics ha venido a ayudarnos. Cómo sabes si tus esfuerzos en Social Media te están dando resultados? Para eso hay que medir, y Google Analytics ha venido a ayudarnos. Hoy en día, las piedras angulares de los negocios son las páginas

Más detalles

PRÁCTICA 4 PASO DE MENSAJES

PRÁCTICA 4 PASO DE MENSAJES PRÁCTICA 4 PASO DE MENSAJES Introducción Cuando los procesos interactúan unos con otros pueden necesitar intercambiar información. Uno de los métodos posibles para conseguir esto es el paso de mensajes.

Más detalles

FUNDAMENTOS DE REDES CONCEPTOS DE LA CAPA DE APLICACIÓN

FUNDAMENTOS DE REDES CONCEPTOS DE LA CAPA DE APLICACIÓN FUNDAMENTOS DE REDES CONCEPTOS DE LA CAPA DE APLICACIÓN Mario Alberto Cruz Gartner malcruzg@univalle.edu.co Conceptos La última capa o Capa 7 del modelo OSI se denomina capa de aplicación. La capa de aplicación

Más detalles

DHCP. Dynamic Host Configuration Protocol. Protocolo de Configuración Dinámica de Host. Administración de Redes de Computadores

DHCP. Dynamic Host Configuration Protocol. Protocolo de Configuración Dinámica de Host. Administración de Redes de Computadores DHCP Dynamic Host Configuration Protocol Protocolo de Configuración Dinámica de Host Administración de Redes de Computadores John Deivis Tabares Tobón Luis Fernando Ramirez CONFIGURACION DEL SERVIDOR DHCP

Más detalles

UNIDADES DE ALMACENAMIENTO DE DATOS

UNIDADES DE ALMACENAMIENTO DE DATOS 1.2 MATÉMATICAS DE REDES 1.2.1 REPRESENTACIÓN BINARIA DE DATOS Los computadores manipulan y almacenan los datos usando interruptores electrónicos que están ENCENDIDOS o APAGADOS. Los computadores sólo

Más detalles

Arquitecturas cliente/servidor

Arquitecturas cliente/servidor Arquitecturas cliente/servidor Conceptos básicos 1 Conceptos básicos 1. Definición de puerto 2. Sockets 3. Conceptos cliente/servidor 4. Definición de Stream 5. Concurrencia, multiprogramación y multitarea

Más detalles

Guía de uso del Cloud Datacenter de acens

Guía de uso del Cloud Datacenter de acens guíasdeuso Guía de uso del Cloud Datacenter de Calle San Rafael, 14 28108 Alcobendas (Madrid) 902 90 10 20 www..com Introducción Un Data Center o centro de datos físico es un espacio utilizado para alojar

Más detalles

MANUAL PARA GESTIÓN DE INCIDENCIAS INFORMÁTICAS

MANUAL PARA GESTIÓN DE INCIDENCIAS INFORMÁTICAS MANUAL PARA GESTIÓN DE INCIDENCIAS INFORMÁTICAS En este manual aprenderemos a introducir un Ticket de Soporte (Incidencia Informática) y ver todo el proceso hasta que se resuelve. Para poder escribir Tickets

Más detalles

Manual de uso de la plataforma para monitores. CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib

Manual de uso de la plataforma para monitores. CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib Manual de uso de la plataforma para monitores CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES -bilib [Manual de uso de la plataforma para monitores] 1. Licencia Autor del documento: Centro de Apoyo Tecnológico

Más detalles

Práctica 3 de Redes de Área Local Cliente y Servidor de ficheros concurrente

Práctica 3 de Redes de Área Local Cliente y Servidor de ficheros concurrente Práctica 3 de Redes de Área Local Cliente y Servidor de ficheros concurrente 3 o curso de Ingeniería Técnica en Informática de Sistemas 13 de abril de 2007 El objetivo de esta práctica es realizar una

Más detalles

Direcciones IP y máscaras de red

Direcciones IP y máscaras de red También en este nivel tenemos una serie de protocolos que se encargan de la resolución de direcciones: ARP (Address Resolution Protocol): cuando una maquina desea ponerse en contacto con otra conoce su

Más detalles

TEMA: PROTOCOLOS TCP/IP

TEMA: PROTOCOLOS TCP/IP TEMA: PROTOCOLOS TCP/IP HISTORIA: El Protocolo de Internet (IP) y el Protocolo de Transmisión (TCP), fueron desarrollados inicialmente en 1973 por el informático estadounidense Vinton Cerf como parte de

Más detalles

Institución Educativa Inem Felipe Pérez de Pereira 2012 Estrategia taller. AREA: Sistemas de información Taller 1 2 3 4 Previsto 1 2 3 4 5 6 7 8 9 10

Institución Educativa Inem Felipe Pérez de Pereira 2012 Estrategia taller. AREA: Sistemas de información Taller 1 2 3 4 Previsto 1 2 3 4 5 6 7 8 9 10 Grado 10º Tiempo (semanas) GUÍA DE FUNDAMENTACIÓN Institución Educativa AREA: Sistemas de información Taller 1 2 3 4 Previsto 1 2 3 4 5 6 7 8 9 10 Fecha Real 1 2 3 4 5 6 7 8 9 10 Área/proyecto: es y Mantenimiento

Más detalles

Informàtica i Comunicacions Plaça Prnt. Tarradellas, 11 17600 FIGUERES (Girona) Tel. 902 88 92 67 Fax 972 671 962 www.cesigrup.es

Informàtica i Comunicacions Plaça Prnt. Tarradellas, 11 17600 FIGUERES (Girona) Tel. 902 88 92 67 Fax 972 671 962 www.cesigrup.es DNS (Domain Name System)...2 La estructura... 2 Servidores DNS e Internet... 3 Dominios... 3 Servidores de nombres... 3 Servidores de nombres Principal y Secundario... 4 Los archivos del DNS... 4 Registro

Más detalles

Crear la base de datos antes de la instalación de Wordpress.

Crear la base de datos antes de la instalación de Wordpress. Introducción En este tutorial básico sobre instalar Wordpress en tu propio hosting mediante un panel de control cpanel y aprenderás como personalizar las bases de datos MySQL que utiliza Wordpress. Para

Más detalles

SOCKETS BASADOS EN CONEXIÓN (SOCK_STREAM)

SOCKETS BASADOS EN CONEXIÓN (SOCK_STREAM) RESUMEN - Servicios UNIX para Sockets SII Curso 2017/2018 SOCKETS BASADOS EN CONEXIÓN (SOCK_STREAM) int socket(int dominio, int tipo, int protocolo); Devuelve el descriptor de fichero para acceder al socket

Más detalles

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia Introduccion al Lenguaje C Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia Introducción C es un lenguaje de programación creado en 1972 por

Más detalles

Interfaz de Programación del Controlador MCA

Interfaz de Programación del Controlador MCA Interfaz de Programación del Controlador MCA Alan Cox alan@redhat.com David Weinehall Chris Beauregard Interfaz de Programación del Controlador MCA por Alan Cox, David Weinehall, y Chris Beauregard Copyright

Más detalles

Servicio de Informática Vicerrectorado de Tecnologías de la Información y la Comunicación

Servicio de Informática Vicerrectorado de Tecnologías de la Información y la Comunicación Vicerrectorado de Tecnologías de la Información y la Comunicación Conexión mediante Escritorio Remoto de Windows Última Actualización 16 de septiembre de 2013 Histórico de cambios Fecha Descripción Autor

Más detalles

Iptables, herramienta para controlar el tráfico de un servidor

Iptables, herramienta para controlar el tráfico de un servidor Iptables, herramienta para controlar el tráfico de un servidor La seguridad es punto muy importante a tener en cuenta en cualquier organización de ahí que sea fundamental hacer uso de aquellos mecanismos

Más detalles

HOW TO SOBRE FIREWALL

HOW TO SOBRE FIREWALL HOW TO SOBRE FIREWALL 1- En este how to estaremos estableciendo algunas reglas con el firewall para bloquear el acceso, o permitirlo. Lo primero que haremos es abrir la consola, ubicada en aplicaciones,

Más detalles

EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET

EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET 1 EL MODELO DE ESTRATIFICACIÓN POR CAPAS DE TCP/IP DE INTERNET Cada capa de la pila añade a los datos a enviar a la capa inferior, información de control para que el envío sea correcto. Esta información

Más detalles

Firewall Firestarter. Establece perímetros confiables.

Firewall Firestarter. Establece perímetros confiables. Firewall Firestarter Qué es un Firewall? Un muro de fuego (firewall en inglés) es una parte de un sistema o una red que está diseñada para bloquear el acceso no autorizado, permitiendo al mismo tiempo

Más detalles

Guía de Uso. Hemos creado esta Guía de Uso para que puedas aprovechar al máximo tu experiencia en StartBull.

Guía de Uso. Hemos creado esta Guía de Uso para que puedas aprovechar al máximo tu experiencia en StartBull. Bienvenido a StartBull, Ahora haces parte de una comunidad de personas interesadas e involucradas en el mercado de capitales alrededor del mundo. Esperamos que nuestra plataforma te sirva para aprender

Más detalles

Método para ganar dinero con YouTube y Clickbank sin tener que subir videos ni hacer comentarios

Método para ganar dinero con YouTube y Clickbank sin tener que subir videos ni hacer comentarios Método para ganar dinero con YouTube y Clickbank sin tener que subir videos ni hacer comentarios Por ImperioDinero.com Nota legal: El contenido de esta guía es propiedad de ImperioDinero.com. No tienes

Más detalles