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

Publicado el 18 de Abril del 2021
411 visualizaciones desde el 18 de Abril del 2021
152,0 KB
20 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. ........................................................................................................................5
Direcciones IP........................................................................................................................5
Funciónes Importantes ........................................................................................................6
Algunas palabras sobre dns..............................................................................................14
Un ejemplo de Servidor de Flujos ....................................................................................15
Un ejemplo de Cliente de Flujos.......................................................................................17
Últimas Palabras .................................................................................................................18

Introducción

¿Estás tratando de aprender programación en C de sockets? ¿O piensas que es una
tarea demaciado 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. Luego de 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 archivos es-
tándard de Unix. En Unix, todas las acciones de entrada y salida son desempeñadas
escribiendo o leyendo en uno de estos descriptores de archivo, los cuales son simple-
mente un número entero, asociado a un archivo abierto que puede ser una conexión
de red, una 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 "¿cual es la diferencia entre estos dos tipos?", podrías preguntarte. He aquí la re-
spuesta:

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 a destino en el mismo orden -- "A, B, C". Estos sockets usan TCP
("Transmission Control Protocol2") y es éste protocolo el que nos asegura el orden de
los objetos durante la transmisión.

Sockets de Datagramas
Estos usan UDP (“User Datagram Protocol3”), 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 lo enviará afuera, sin necesidad de una conexión.
Mucho más podría ser explicado 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 aprederá 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 estas en la programación en C de Sockets. 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,

3

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

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; /* familia de la dirección */
char sa_data[14]; /* 14 bytes de la dirección del protocolo */

};

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; /* Familia de la Dirección */
unsigned short int sin_port; /* Puerto */
struct in_addr sin_addr; /* Dirección de Internet */
unsigned char sin_zero[8];
/* Del mismo tamaño que struct sockaddr */

};

Nota
sin_zero puede ser seteada 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; /* El nombre oficial del nodo.

*/

4

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

char **h_aliases; /* Lista de Alias.
int h_addrtype; /* Tipo de dirección del nodo.
int h_length; /* Largo de la dirección. */
char **h_addr_list; /* Lista de direcciones de el nombre del servi-

*/

*/

dor. */

#define h_addr h_addr_list[0]

/* Dirección, para la compatibili-

dad con anteriores. */
};

Esta estructura está definida en el archivo netdb.h.
Al principio, es posible que estas estructuras nos confundan mucho. Sin embargo,
luego de empezar a escribir algunas líneas de código, y luego de ver los ejemplos
que se incluyen en este tutorial, será mucho más fácil entenderlas. Para ver cómo se
pueden 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.

Conversiones.

Existen dos tipos de ordenamiento de bytes: bytes más significativos, y bytes menos
significativos. Este es llamado “Ordenamiento de Bytes para Redes 5 ”, y hasta algunas
máquinas utilizan este tipo de ordenamiento para guardar sus datos, internamente.
Existen dos tipos a los cuales seremos capaces de convertir: short y long 6. Imaginé-
monos que se quiere convertir una variable larga de Ordenación de Bytes para Nodos
a una de Ordenación de Bytes para Redes. ¿Qué haríamos? Existe una función lla-
mada htonl() que haría exactamente esta conversión. Las siguientes funciónes son
análogas a esta 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ás es leer y precticar
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().

5

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

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("Address is: %s\n",ip);

(...)

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().

Funciónes 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 sintáxis de la función, las li-
brerías necesarias a incluír para llamar llamarla, y algunos pequeños comentarios.
Además de las que se mencionan aquí, existen muchas funciones más, aunque sólo
decidí incluír estas. Tal vez sean incluídas en una futura versión de este documento7.
Nuevamente, para ver ejemplos sobre el uso de estas funciones, se podrán leer la sec-
ció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.

6

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

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).
Estas 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 (d
  • Links de descarga
http://lwp-l.com/pdf19113

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