# 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="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2F16EFw40V2obFfQzudFU6%2FScreen-Recording-2022-10-08-at-1.gif?alt=media&#x26;token=683f38b2-fbbe-4506-8c0f-ae4df1089b4c" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2FQwPJRU1oluLhWChYIUfX%2FScreenshot%202022-10-08%20at%2016.26.08.png?alt=media&#x26;token=e201df1f-3127-4efa-8ae4-3f96100569e9" 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="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2FRlUaZOJBLYJ6U61qM6Z2%2FScreen-Recording-2022-10-08-at-1%20(1).gif?alt=media&#x26;token=6ea76f09-cb35-4a68-9e8d-9a58a588a076" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2FYRAJN3Lzpn04hS1RZ9cv%2FScreenshot%202022-10-08%20at%2016.29.16.png?alt=media&#x26;token=0f5f69ab-df46-4726-a5c5-f985fc9d554a" 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.
