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

<<>>
Imágen de pdf Programación Básica de Sockets en Unix para Novatos

Programación Básica de Sockets en Unix para Novatosgráfica de visualizaciones

Actualizado el 20 de Julio del 2017 (Publicado el 14 de Enero del 2017)
1.522 visualizaciones desde el 14 de Enero del 2017
171,7 KB
18 paginas
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 .........................................................................................................................4
Direcciones IP........................................................................................................................5
Funciones Importantes ........................................................................................................6
Algunas palabras sobre dns..............................................................................................12
Un ejemplo de Servidor de Flujos ....................................................................................13
Un ejemplo de Cliente de Flujos.......................................................................................14
Últimas Palabras .................................................................................................................15

Introducción

¿Estás tratando de aprender programación de sockets en C? ¿O piensas que es una
tarea demasiado difícil? Si es así, debes leer este tutorial básico para aprender las
ideas y conceptos básicos y así, empezar a trabajar con sockets. Tras leer este tutorial
no esperes ser un “maestro” en la programación de sockets. Sólo lo serás si practicas
y lees mucho.

Diferentes tipos de sockets en Internet

En primer lugar deberé explicar qué es un socket. De un modo muy simple, se puede
decir que es una manera de hablar con otra computadora. Para ser más preciso, es
una manera de hablar con otras computadoras usando descriptores de ficheros es-
tándar de Unix. En Unix, todas las acciones de entrada y salida son desempeñadas
escribiendo o leyendo en uno de estos descriptores de fichero, los cuales son simple-
mente un número entero, asociado a un fichero abierto que puede ser una conexión
de red, un terminal, o cualquier otra cosa1
Ahora bien, sobre los diferentes tipos de sockets en Internet, hay muchos tipos pero
sólo se describirán dos de ellos - Sockets de Flujo (SOCK_STREAM) y Sockets de Data-
gramas (SOCK_DGRAM).
Y “¿cuál es la diferencia entre estos dos tipos?”, podrías preguntarte. He aquí la res-
puesta:

Sockets de Flujo
Están libres de errores: Si por ejemplo, enviáramos por el socket de flujo tres objetos
"A, B, C", llegarán al destino en el mismo orden -- "A, B, C". Estos sockets usan TCP
("Transmission Control Protocol"2) y es este protocolo el que nos asegura el orden de
los objetos durante la transmisión.

Sockets de Datagramas
Éstos usan UDP (“User Datagram Protocol”3), y no necesitan de una conexión acce-
sible como los Sockets de Flujo -- se construirá un paquete de datos con información
sobre su destino y se enviará afuera, sin necesidad de una conexión.
Mucho más podría explicarse aquí sobre estas dos clases de sockets, pero creo que
esto es suficiente como para captar el concepto básico de socket. Entender qué es
un socket y algo sobre estos dos tipos de sockets de Internet es un buen comienzo,
pero lo más importante será saber cómo trabajar con ellos. Esto se aprenderá en las
próximas secciones.

Estructuras

El propósito de esta sección no es enseñar el concepto de estructuras en programación,
sino enseñar cómo se usan éstas en la programación de Sockets en C. Si no sabes
lo que es una estructura, mi consejo es leer un buen tutorial de C. Por el momento,
digamos simplemente que una estructura es un tipo de dato que es un conglomerado,
o sea, que puede contener otros tipos de datos, los cuales son agrupados todos juntos
en un único tipo definido por el programador.
Las estructuras son usadas en la programación de sockets para almacenar informa-
ción sobre direcciones. La primera de ellas es struct sockaddr, la cual contiene infor-
mación del socket.

struct sockaddr
{

unsigned short sa_family;
char sa_data[14];

/* familia de la dirección */
/* 14 bytes de la dirección del protocolo */

3

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

};

Pero, existe otra estructura, struct sockaddr_in, la cual nos ayuda a hacer referencia
a los elementos del socket.

struct sockaddr_in
{

short int sin_family;
unsigned short int sin_port; /* Puerto
struct in_addr sin_addr;
unsigned char sin_zero[8];

*/
*/
/* Dirección de Internet
*/
/* Del mismo tamaño que struct sockaddr */

/* Familia de la Dirección

};

Nota
sin_zero puede ser configurada con ceros usando las funciones memset() o bzero()
(Ver los ejemplos más abajo).
La siguiente estructura no es muy usada pero está definida como una unión.
Como se puede ver en los dos ejemplos de abajo (ver la sección de nombre Un ejemplo
de Servidor de Flujos y la sección de nombre Un ejemplo de Cliente de Flujos), cuando
se declara, por ejemplo “client” para que sea del tipo sockaddr_in, luego se hace
client.sin_addr = (...).
De todos modos, aquí está la estructura:

struct in_addr
{

unsigned

long s_addr;

};

Finalmente, creo que es mejor hablar sobre la estructura hostent. En el ejemplo de
Cliente de Flujos (ver la sección de nombre Un ejemplo de Cliente de Flujos), se puede
ver cómo se usa esta estructura, con la cual obtenemos información del nodo remoto4.
Aquí se puede ver su definición:

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]

};

/* El nombre oficial del nodo.
/* Lista de Alias.
/* Tipo de dirección del nodo.
/* Longitud de la dirección.
/* Lista de direcciones del nombre del
/* servidor.
/* Dirección, para la compatibilidad con
/* anteriores.

*/
*/
*/
*/
*/
*/
*/
*/

Esta estructura está definida en el fichero netdb.h.
Al principio, es posible que estas estructuras nos confundan mucho. Sin embargo,
después de empezar a escribir algunas líneas de código, y tras ver los ejemplos que
se incluyen en este tutorial, será mucho más fácil entenderlas. Para ver cómo se pue-
den usar estas estructuras, recomiendo ver los ejemplos de la sección de nombre Un
ejemplo de Servidor de Flujos y la sección de nombre Un ejemplo de Cliente de Flujos.

4

Conversiones

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

Existen dos tipos de ordenamiento de bytes: bytes más significativos, y bytes menos
significativos. Éste es llamado “Ordenación de Bytes para Redes”5, algunas máquinas
utilizan este tipo de ordenación para guardar sus datos internamente.
Existen dos tipos a los cuales seremos capaces de convertir: short y long 6. Imagi-
némonos que se quiere convertir una variable larga de Ordenación de Bytes para
Nodos a una de Orden de Bytes para Redes. ¿Qué haríamos? Existe una función lla-
mada htonl() que haría exactamente esta conversión. Las siguientes funciones son
análogas a ésta y se encargan de hacer este tipo de conversiones:

• htons() -> “Nodo a variable corta de Red”
• htonl() -> “Nodo a variable larga de Red”
• ntohs() -> “Red a variable corta de Nodo”
• ntohl() -> “Red a variable larga de Nodo”
Estarás pensando ahora para qué necesitamos todas estas funciones, y el porqué de
estos ordenamientos. Bien, cuando se termine de leer este documento todas estas
dudas se aclararán (aunque sea un poco). Todo lo que necesitará es leer y practicar
mucho.
Una cosa importante, es que sin_addr y sin_port, de la estructura sockaddr_in,
deben ser del tipo Ordenación de Bytes para Redes. Se verá, en los ejemplos, las
funciones que aquí se describen para realizar estas conversiones, y a ese punto se
entenderán mucho mejor.

Direcciones IP

En C, existen algunas funciones que nos ayudarán a manipular direcciones IP. En esta
sección se hablará de las funciones inet_addr() y inet_ntoa().
Por un lado, la función inet_addr() convierte una dirección IP en un entero largo
sin signo (unsigned long int), por ejemplo:

(...)

dest.sin_addr.s_addr = inet_addr("195.65.36.12");

(...)

/*Recordar que esto sería así, siempre que tengamos una estructura "dest"
del tipo sockaddr_in*/

Por otro lado, inet_ntoa() convierte a una cadena que contiene una dirección IP en
un entero largo. Por ejemplo:

(...)

char *ip;

ip=inet_ntoa(dest.sin_addr);

printf("La dirección es: %s\n",ip);

(...)

5

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

Se deberá recordar también que la función inet_addr() devuelve la dirección en
formato de Ordenación de Bytes para Redes por lo que no necesitaremos llamar a
htonl().

Funciones Importantes

En esta sección, (en la cual se nombrarán algunas de las funciones más utilizadas para
la programación en C de sockets), se mostrará la sintaxis de la función, las bibliotecas
necesarias a incluir para llamarla, y algunos pequeños comentarios. Además de las
que se mencionan aquí, existen muchas funciones más, aunque sólo decidí incluir
éstas. Tal vez sean incluidas en una futura versión de este documento7. Nuevamente,
para ver ejemplos sobre el uso de estas funciones, se podrá leer la sección de nombre
Un ejemplo de Servidor de Flujos y la sección de nombre Un ejemplo de Cliente de Flujos,
en las cuales hay código fuente de un Cliente de Flujos y un Servidor de Flujos.

socket()

#include <sys/types.h>
#include <sys/socket.h>

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

Analicemos los argumentos:



domain

Se podrá establecer como AF_INET (para usar los protocolos ARPA de Internet), o
como AF_UNIX (si se desea crear sockets para la comunicación interna del sistema).
Éstas son las más usadas, pero no las únicas. Existen muchas más, aunque no se
nombrarán aquí.



type

Aquí se debe especificar la clase de socket que queremos usar (de Flujos o de Data-
gramas). Las variables que deben aparecer son SOCK_STREAM o SOCK_DGRAM
  • Links de descarga
http://lwp-l.com/pdf1349

Comentarios de: Programación Básica de Sockets en Unix para Novatos (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad