> 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/stream-sockets.md).

# Stream sockets

Com **streams**, o socket tem a mesma funcionalidade que *datagrams*, mas com a diferença que uma **conexão é criada** entre o pipe do *client* e o pipe do *server*.&#x20;

Nesta conexão, é implementado um **conjunto de procedimentos** de pergunta-resposta para **garantir** que a mensagem é entregue em sua *totalidade e na ordem correta*.

Com isto, podemos dizer que stream sockets utilizam uma conexão, ao passo que datagram sockets não utilizam uma conexão.&#x20;

<figure><img src="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2FLw9dhQQBS0ft66imuLXn%2FScreenshot%202022-10-08%20at%2017.04.19.png?alt=media&amp;token=aebadd33-7f07-4ee3-8e1d-cff54e85f0f4" alt=""><figcaption></figcaption></figure>

Por padrão, o comando `nc` trabalha com sockets de **conexão**, portanto para criarmos um socket stream basta **removermos** a opção `-u`, opção esta que utilizamos para criar *datagram* sockets na última seção.

```bash
## Server
$ nc -Ulv server.sock
Bound on server.sock
Listening on server.sock
```

Note que agora, vemos uma mensagem "Listening on server.sock", que significa que o server está **à espera de novas conexões** no socket.&#x20;

Para criar o client, o processo é o mesmo, **não utilizando** a opção `-u`:

```bash
$ nc -Uv server.sock
```

<figure><img src="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2FKT7Ol3qSdCihDBYX6Jvt%2FScreen-Recording-2022-10-08-at-1%20(6).gif?alt=media&amp;token=044a5e97-3cf6-4f67-aa5c-ca529e450251" alt=""><figcaption></figcaption></figure>

### Resumo

Até aqui, conseguimos entender **UNIX sockets** e a diferença entre *datagram* e *stream*.&#x20;

*So far so good*, mas os processos estão sempre no mesmo computador. Indo um pouco mais além, seria possível que **2 processos isolados em computadores distintos** se comunicassem?

Sim, caso os computadores estejam conectados na mesma **rede local** (LAN) ou em uma *rede global de computadores* (**Internet**).&#x20;

<figure><img src="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2Fo8YS2B07dplu9whwi3p9%2FScreenshot%202022-10-08%20at%2017.33.37.png?alt=media&amp;token=b2714a3c-df20-4626-b631-804e2714be36" alt=""><figcaption></figcaption></figure>

Um UNIX socket por si só **não resolve IPC** entre 2 processos em computadores distintos conectados numa rede local ou global.

Vamos, então, explorar outras opções de IPC para processos em computadores distintos nas próximas seções deste guia.
