SDK Multiplataforma en C logo

SDK Multiplataforma en C

Sockets

❮ Anterior
Siguiente ❯

Los sockets establecen un canal de comunicación entre dos procesos remotos a través de Internet.


Funciones

Socket*bsocket_connect (...)
voidbsocket_close (...)
voidbsocket_ip (...)
bool_tbsocket_read (...)
bool_tbsocket_write (...)
bool_tbsocket_host_ip (...)
uint32_tbsocket_ipv4 (...)

Podemos definir un socket como un canal de comunicación entre dos procesos que están ejecutándose en diferentes máquinas. Utilizan como base la familia de protocolos TCP/IP que rigen la comunicación por Internet desde los primeros prototipos de la gran red allá por el año 1969. Por su parte, el protocolo IP (Internet Protocol) se encarga del envío de pequeños paquetes de datos entre dos computadores remotos a través de la red. Como hay paquetes que pueden perderse o tomar diferentes caminos al atravesar los nodos de Internet, TCP (Transmission Control Protocol) se encargará de ordenarlos secuencialmente y volver a pedir aquellos que se han perdido. Otro aspecto importante que añade TCP es el concepto de puerto lo que permite que una misma máquina disponga de múltiples conexiones abiertas al mismo tiempo. La conjunción de TCP/IP provee al proceso de un canal fiable de comunicación bidireccional (full-duplex) con el ordenador remoto con el que acaba de conectarse y es la base del modelo cliente/servidor (Figura 1).

Esquema que muestra dos procesos remotos conectados mediante un socket a través de Internet.
Figura 1: Los sockets TCP/IP permiten conectar dos procesos a través de Internet.

Ya dentro del programa, trabajar con sockets es muy parecido a trabajar con archivos en disco. La implementación de TCP/IP es complicada y forma parte del sistema operativo. Accederemos a ella a través de llamadas al sistema muy simplificadas que nos permitirán crear conexiones bsocket_connect, escribir en el canal bsocket_write y leer del mismo bsocket_read. Ya que un socket tan solo permite enviar y recibir bytes, el diálogo entre los dos extremos queda determinado por el protocolo establecido, que ambos interlocutores deben implementar para que la comunicación se produzca de forma satisfactoria. Algunos de los más utilizados en Internet son: HTTP, SMTP, FTP, SSH, etc.


bsocket_connect ()

Crea un socket cliente e intenta establecer una conexión con un servidor remoto.

Socket*
bsocket_connect(const uint32_t ip,
                const uint16_t port,
                const SockOpt *opts,
                serror_t *error);
ip

La dirección IPv4 32-bit del host remoto. bsocket_ipv4.

port

El puerto de conexión.

opts

Opciones de creación del socket. Puede ser NULL para valores por defecto.

error

Código de error si la función falla. Puede ser NULL.

Retorna

Manejador del socket, o NULL si la función falla.


bsocket_close ()

Cierra un socket previamente creado con bsocket_connect.

void
bsocket_close(Socket **socket);
socket

El manejador del socket. Será puesto a NULL tras el cierre.


bsocket_ip ()

Obtiene la dirección ip y el puerto local asociado al socket.

void
bsocket_ip(Socket *socket,
           uint32_t *ip,
           uint16_t *port);
socket

Manejador del socket.

ip

Dirección IP local.

port

Puerto IP local.


bsocket_read ()

Lee datos desde el socket.

bool_t
bsocket_read(Socket *socket,
             byte_t *data,
             const uint32_t size,
             uint32_t *rsize,
             serror_t *error);
socket

Manejador del socket.

data

Búfer donde se escribirán los datos leídos.

size

El número de bytes máximos a leer (tamaño del búfer).

rsize

Recibe el número de bytes leídos realmente. Puede ser NULL.

error

Código de error si la función falla. Puede ser NULL.

Retorna

TRUE si se han leído datos. FALSE si ha ocurrido algún error.

Observaciones

Socket stream implementa funciones de alto nivel para lectura/escritura en sockets.


bsocket_write ()

Escribe datos en el socket.

bool_t
bsocket_write(Socket *socket,
              const byte_t *data,
              const uint32_t size,
              uint32_t *wsize,
              serror_t *error);
socket

Manejador del socket.

data

Búfer que contiene los datos a escribir.

size

El número de bytes a escribir.

wsize

Recibe el número de bytes escritos realmente. Puede ser NULL.

error

Código de error si la función falla. Puede ser NULL.

Retorna

TRUE si se han escrito datos. FALSE si ha ocurrido algún error.

Observaciones

Socket stream implementa funciones de alto nivel para lectura/escritura en sockets.


bsocket_host_ip ()

Obtiene el valor decimal de la dirección IPv4 de un host a partir de su url.

bool_t
bsocket_host_ip(const char_t *url,
                uint32_t *ip,
                serror_t *error);
1
2
3
4
5
6
uint32_t ip;
if (bhost_ip("www.google.com", &ip, NULL) == TRUE)
{
    Socket *sock = bsocket_connect(ip, 80, NULL, NULL);
    ...
}
url

La url del host p.e, www.google.com.

ip

Valor de la dirección IPv4 del host.

error

Código de error si la función falla. Puede ser NULL.

Retorna

TRUE si ha funcionado correctamente, FALSE si no.


bsocket_ipv4 ()

Compone el valor decimal de una dirección IP de 32-bit a partir de los cuatro valores de la notación por puntos (a.b.c.d).

uint32_t
bsocket_ipv4(uint8_t a,
             uint8_t b,
             uint8_t c,
             uint8_t d);
1
uint32_t ip = bsocket_ipv4(216, 58, 210, 164);
a

Primer valor.

b

Segundo valor.

c

Tercer valor.

d

Cuarto valor.

Retorna

El valor IP decimal de 32-bit.

❮ Anterior
Siguiente ❯