UNIX Sockets

Para entender o que é um socket, vamos lembrar dos named pipes, que são arquivos FIFO compartilhados entre dois processos.

Named pipes são uni-direcionais

Um processo reader fica bloqueado na fila até que alguma mensagem de outro processo writer seja escrita no pipe.

## Cria o arquivo FIFO
$ mkfifo queue.sock

## Reader
$ cat queue.sock

## Writer
$ echo PING > queue.sock

Como podemos ver no exemplo, named pipes são a princípio uni-direcionais, ou seja, a informação caminha em apenas uma direção. No nosso caso, do writer para o reader, e não o contrário.

Para que a comunicação seja bi-direcional, ou seja, que caminhe em ambas direções, temos de criar 2 named pipes.

Vamos simular uma comunicação request-response, numa arquitetura também conhecida como cliente-servidor:

## Cria os named pipes FIFO
$ mkfifo req res

## Server
$ cat req; echo PONG > res

## Client
$ echo PING > req; cat res

Note acima que a informação caminha do client para o server, através do pipe req, e do server para o client através do pipe res. Este tipo de comunicação é bi-direcional, ou full-duplex.

E se, ao invés de pipes, pudéssemos utilizar uma estrutura nativa do sistema operacional, que faça uso de file descriptors, garanta comunicação full-duplex e possua diversas formas de envio de mensagens?

Sim, estamos falando de sockets.

UNIX Sockets

Sockets são estruturas de networking para comunicação full-duplex entre dois processos distintos (IPC). Para este guia, vamos focar em socket utilizado em ambientes UNIX-like, mais especificamente Ubuntu.

Começamos por instalar um pacote chamado netcat, que permite manipular sockets do sistema operacional:

$ apt install netcat

A API de UNIX sockets é bastante versátil e permite enviar diferentes tipos de mensagens para diferentes tipos de propósitos.

Portanto, nas próximas seções iremos explorar os principais tipos de sockets e suas diferenças.

Last updated