Sockets en windows
Al final me he decidido a escribir el tutorial sobre winsock, espero que os guste.
En éste tutorial vamos a introducirnos en el mundo de los sockets en c para windows,
para hacerlo fácil voy a explicar sólo las conexiones tcp/ip.
Supongo que ya lo sabrás pero por si acaso decir que en una conexión a través de internet (o en lan,
da igual) conectarán dos pcs, para ellonecesitan dos parametros, el primero es la ip que sería
cómo la dirección de tu casa y el otro el puerto que sería con quien quiere hablar dentro de la casa:
con la mula, con el messenger, con el internet explorer...
Para ello uno de los dos ordenadores tiene que estar escuchando y esperando a que alguien conecte,
a este ordenador se le llama el servidor, y al que conecta se le llama el cliente.Cuando cliente y servidor han conectado ya pueden recibir o enviar datos sin preocuparse de nada mas
hasta que se cierre la conexión.
Bueno dejemos las explicaciones by barrio sésamo y vamos a lo que interesa.
2.-Funciones de winsock
Aquí intentaré explicar todas las funciones que vamos a utilizar en el programa. Si vas a programar
un servidor, solo necesitas las funciones2.01,2.02,2.04,2.06,2.07,2.08,2.09 y 2.09 y si vas a
programar un cliente necesitas entender las 2.01,2.02,2.03,2.04,2.05,2.09 y 2.10.
2.01.-WSAStartup
Esta función lo que hace es inicializar el winsock en nuestro programa y definir la versión que
vamos a utilizar, lo que cambia entre versiones es que unas tienen mas funciones a usar y otras
menos, nosotros cómo vamos a lo básico sólo nos interesacompatibilidad y por tanto usaremos la
version 2.0 que viene con todos los windows
Para ello haremos lo siguiente:
Definimos una variable para la inicializacion
WSADATA wsa;
Inicializamos determinando la versión 2.0 para ello usamos MAKEWORD que pasará ese 2.0 a una
variable de tipo WORD (16bits) que es lo que pide la función. También pasamos wsa por referéncia
para que la modifique.WSAStartup(MAKEWORD(2,0),&wsa);
2.02.-socket
Con la funcion socket lo que hacemos es crear un socket (una conexión para que se entienda)
definiendo el protocolo de la conexión y el tipo de información que se trasmitirá a través de él.
definimos un socket
SOCKETsock;
Creamos el socket de tipo AF_INET (protocolo ipv4), SOCK_STREAM (tipo de paquetes para tcp),
IPPROTOTCP (protocolo tcp).sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
2.03.-gethostbyname
Con gethostbyname lo que hacemos es resolver un dominio cómo podría ser www.google.com,
irc.irc-hispano.org, mazard.no-ip.org... a la ip que le corresponde, así luego podremos
conectar.
Definimos una estructura del tipo hostent, esta estructura guardará toda la información a
bajo nivel sobre el host al que vayamos a conectar.Si a gethostbyname le pasamos una ip
directamente no la resolverá y la asignará a direc correctamente.
structhostent *direc;
Ahora resolvemos el nombre del host y se lo asignamos a la direccion.
direc=gethostbyname("www.google.es");
Nota: Si no quisieramos resolver el nombre de dominio podriamos usar la función inet_addr
para transformar la ip de cadena de caracteres a una variable detipo in_addr. Pero es
mejor utilizar esta función siempre, tiene la misma utilidad que in_addr y además te resuelve
nombres de dominio.
2.04.-htons
Con esta funcion guardaremos el puerto al que vamos a conectar mas adelante.
En el protocolo de red los puertos no se expresan igual que los expresamos nosotros, no entraremos
en detalles pero si tienes curiosidad busca bigendian, littleendiano tcp/ipnetwork byte order
en google.
ununsigned short se ajusta exactamente al rango en el que pueden ir los puertos, desde 1 hasta
65535.
u_short puerto;
Así transformamos el puerto 9999 "al lenguaje que entenderá" el socket.
puerto=htons(9999);
2.05.-connect
Con esta función conseguiremos conectar con la máquina remota, esta es la parte mas delicada,
intentaré explicarla lo...
Regístrate para leer el documento completo.