> For the complete documentation index, see [llms.txt](https://web101.leandronsp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://web101.leandronsp.com/comunicacao-entre-processos/unix-sockets.md).

# 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.&#x20;

```bash
## Cria o arquivo FIFO
$ mkfifo queue.sock

## Reader
$ cat queue.sock

## Writer
$ echo PING > queue.sock
```

<figure><img src="/files/1yLxtpZEcNj4ysxefI1v" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/6w9Lt4c5FJCoDHooC2pa" alt=""><figcaption></figcaption></figure>

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.*&#x20;

Vamos simular uma comunicação **request-response,** numa arquitetura também conhecida como **cliente-servido**&#x72;*:*

```bash
## Cria os named pipes FIFO
$ mkfifo req res

## Server
$ cat req; echo PONG > res

## Client
$ echo PING > req; cat res
```

<figure><img src="/files/Efxkn8J52XTvyxcS6vSl" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/80ZW0zA3MTtqHEsl2M4M" alt=""><figcaption></figcaption></figure>

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**.&#x20;

## 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:

```bash
$ apt install netcat
```

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

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