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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://web101.leandronsp.com/comunicacao-entre-processos/unix-sockets.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
