Guía Beej de programación en redes

Anterior


Siguiente


1. Introducción

¡Eh!, ¿la programación de sockets te quita el sueño? ¿Todo esto es demasiado complicado para desentrañarlo sólo con las páginas de man? Quieres hacer buenos programas para Internet, pero no tienes tiempo de pelearte con montones de structs para tratar de adivinar si tienes que ejecutar bind() antes que connect() , etc., etc.

Bueno, ¿sabes qué?, ya me he ocupado de todo ese molesto asunto y estoy deseando compartir la información con todo el mundo. Has venido al lugar adecuado. Este documento debería bastar para que un programador en C medianamente competente empiece a trabajar en un entorno de redes.

1.1. Destinatarios

Este documento se ha escrito a modo de tutorial, y no como una guía de referencia. Probablemente, es de máxima utilidad para personas que están empezando a programar con sockets y buscan donde apoyarse. No es, en absoluto, la guía completa de programación de sockets.

Sin embargo, con suerte será suficiente para que esas páginas de man empiecen a cobrar sentido... :-)

1.2. Plataforma y compilador

El código que se muestra en este documento se compiló en un PC con Linux usando el compilador gcc de Gnu. Sin embargo, debería poder compilarse en prácticamente cualquier otra plataforma que use gcc. Evidentemente, esto no te sirve si programas para Windows--consulta más abajo la sección sobre programación en Windows .

1.3. Sitio web Oficial

La ubicación oficial de este documento se encuentra en Chico, en la Universidad del Estado de California, en la URL: http://www.ecst.csuchico.edu/~beej/guide/net/ .

1.4. Nota para programadores Solaris/SunOS

Si compilas para Solaris o SunOS, necesitas indicar algunos conmutadores adicionales en la línea de comandos para enlacer las bibliotecas adecuadas. Para conseguirlo simplemente añade " -lnsl -lsocket -lresolv" al final del comando de compilación, como sigue:

    $ cc -o server server.c -lnsl -lsocket -lresolv

Si todavía tienes errores puedes probar a añadir " -lxnet" al final de la línea de comandos. No sé qué es lo que hace exactamente, pero algunas personas parecen necesitarlo para compilar correctamente.

Otro lugar donde podrías encontrar problemas es en la llamada a setsockopt() . El prototipo no es igual que el que tengo en mi Linux, por eso en lugar de:



        int yes=1;

teclea esto:



        char yes='1';

Como no tengo una máquina Sun no he probado ninguna de la información anterior--sólamente es lo que la gente me ha comentado por correo electrónico.

1.5. Nota para programadores Windows

Particularmente, Windows no me gusta en absoluto, y te animo a que pruebes Linux, BSD, o Unix. Dicho esto, puedes usar todo esto con Windows .

En primer lugar, ignora complemente todos los ficheros de cabecera que menciono. Todo lo que necesitas incluir es:



    #include <winsock.h> 

¡Espera! También tienes que ejecutar WSAStartup() antes de hacer nada con la biblioteca de sockets. El código para hacerlo es algo así como:



    #include <winsock.h>
    {
        WSADATA wsaData;   // Si esto no funciona
        //WSAData wsaData; // prueba esto en su lugar
        if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
            fprintf(stderr, "WSAStartup failed.\n");
            exit(1);
        } 

También tienes que decirle a tu compilador que enlace la biblioteca Winsock, que normalmente se llama wsock32.lib o winsock32.lib o algo así. Con VC++, esto puede hacerse con el menú Project , bajo Settings... Haz click en la pestaña Link y busca el cuadro titulado "Object/library modules". Añade "wsock32.lib " a esa lista.

Al menos eso es lo que he oído.

Por último, necesitas ejecutar WSACleanup() cuando hayas terminado con la biblioteca de sockets. Consulta la ayuda en línea para los detalles.

Una vez hecho esto, el resto de ejemplos de este tutorial deberían funcionar con algunas pocas excepciones. En primer lugar, no puedes usar close() para cerrar un socket--en su lugar, tienes que usar closesocket() . Ademas, select() sólo funciona con descriptores de sockets pero no con descriptores de ficheros (como 0 para stdin).

Para más información acerca de Winsock lee el FAQ de Winsock .

Finalmente, he oído que Windows no tiene la llamada al sistema fork() que, desgraciadamente, uso en algunos de mis ejemplos. Quizás debas enlazar también una biblioteca POSIX o algo para que funcione, o puedes usar CreateProcess() en su lugar. fork() no tiene argumentos, y CreateProcess() tiene alrededor de 48 billones de argumentos. Bienvenido al maravilloso mundo de la programación Win32.

1.6. Política de respuesta a correos electrónicos

En general estoy abierto a ayudar con tus preguntas por correo electrónico, así que no dudes en escribirlas, pero no puedo garantizarte una respuesta. Llevo una vida bastante ocupada y a veces, sencillamente, no puede responder a tu pregunta. Cuando esto ocurre, generalmente borro el mensaje. No es nada personal; sólo es que nunca tendré tiempo para darte la detallada respuesta que necesitas.

Como norma general, cuanto más complicada sea tu pregunta, menos probable es que yo responda. Si puedes acotar tu pregunta antes de enviarla y asegurarte de incluir cualquier información que pueda ser de cierta relevancia (plataforma, compilador, mensajes de error que tienes, y cualquier otra cosa que pienses que puede ayudar) es mucho más probable que te responda.

Si no, trabájalo un poco más, trata de encontrar la respuesta, y si el problema se te sigue resistiendo escríbeme otra vez con la información que has reunido y a lo mejor es suficiente para que pueda ayudarte.

Ahora que te he machacado acerca de como debes y como no debes escribirme, me gustaría que supieras que de verdad aprecio todos los cumplidos que esta guía ha recibido a lo largo del tiempo. Es un auténtico acicate moral, y me alegra saber que se usando con alguna finalidad positiva :-) ¡Gracias!

1.7. Replicación

Es una excelente idea si quieres replicar este sitio, bien sea en público o en privado. Si replicas este sitio en público y quieres que añada un enlace desde la página principal escríbeme a: < beej@piratehaven.org >.

1.8. Nota para traductores

Si quieres traducir esta guía a otra idioma, escríbeme a <beej@piratehaven.org > y añadiré un enlace a tu traducción desde la página principal.

No dudes en añadir tu nombre y tu dirección de correo a la traducción.

Lo siento, pero debido a restricciones de espacio no voy a poder alojar las traducciones.

1.9. Copyright y distribución

La Guía de programación en redes de Beej tiene Copyright © 1995-2001 por Brian "Beej" Hall.

Esta guía puede reimprimirse con total libertad por cualquier medio, siempre y cuando su contenido no se altere, se presente íntegramente y este aviso de Coyright permanezca intacto.

Se anima especialmente a los educadores a recomendar o suminstrar copias de esta guía a sus estudiantes.

Esta guía puede traducirse con total libertad a cualquier idioma, siempre y cuando la traducción sea precisa y la guía se reproduzca íntegramente. La traducción podrá incluir también el nombre y la dirección de contacto del traductor.

El código fuente C que se presenta en el documento se otorga al dominio público.

Contacta con < beej@piratehaven.org > para más información.


Anterior

Inicio

Siguiente

Guía de programación en redes de Beej


¿Qué es un socket ?