> 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/internet/pseudo-devices.md).

# Pseudo devices

Uma forma interessante de enviar mensagens para um socket *TCP* ou *UDP* quando não se tem um cliente como `netcat` ou `socat`, é utilizando os **pseudo-devices.**

Os pseudo-devices são criados no **filesystem** e localizados em `/dev`.

```bash
$ ls /dev
console  fd    mqueue  ptmx  random  stderr  stdout  urandom
core     full  null    pts   shm     stdin   tty     zero
```

Quando um TCP server é criado, podemos **enviar uma mensagem** a ele através de pseudo-devices, utilizando a mesma técnica de *redirecionamento de streams* que vimos com file descriptors e standard streams:

```bash
## Server
$ nc -lv 8080
Listening on 0.0.0.0 8080
```

O caminho padrão para um pseudo-device é:

> ```
> /dev/[protocol]/localhost/[port]
> ```

Então enviamos a mensagem sem a necessidade de `netcat`, apenas com **pseudo-devices**:

```bash
$ echo PING > /dev/tcp/localhost/8080
```

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

Note que assim que o server recebeu a mensagem, a **conexão com o cliente foi encerrada** e o processo do s**erver foi terminado**.

Se quisermos que o processo do server se mantenha em execução mesmo quando uma conexão de um cliente encerra, temos que indicar a opção `-k`:

```bash
$ nc -lvk 8080
```

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

Reforçando que, conforme exemplo acima, cada nova conexão é atribuída a uma porta de rede diferente, caracterizando a capacidade **full-duplex** do TCP entre diferentes clientes.
