unpack_string/hw11_telnet_client/README.md

110 lines
3.7 KiB
Markdown
Raw Normal View History

2023-10-30 15:21:12 +03:00
## Домашнее задание №11 «Клиент TELNET»
Необходимо реализовать крайне примитивный TELNET клиент
(без поддержки команд, опций и протокола в целом).
Примеры вызовов:
```bash
$ go-telnet --timeout=10s host port
$ go-telnet mysite.ru 8080
$ go-telnet --timeout=3s 1.1.1.1 123
```
* Программа должна подключаться к указанному хосту (IP или доменное имя) и порту по протоколу TCP.
* После подключения STDIN программы должен записываться в сокет,
а данные, полученные из сокета, должны выводиться в STDOUT - всё происходит конкурентно.
* Опционально в программу можно передать таймаут на подключение к серверу
(через аргумент `--timeout`) - по умолчанию `10s`.
* При нажатии `Ctrl+D` программа должна закрывать сокет и завершаться с сообщением.
* При получении `SIGINT` программа должна завершать свою работу.
* Если сокет закрылся со стороны сервера, то при следующей попытке отправить сообщение программа
должна завершаться (допускается завершать программу после "неудачной" отправки нескольких сообщений).
* При подключении к несуществующему серверу, программа должна завершаться с ошибкой соединения/таймаута.
При необходимости можно выделять дополнительные функции / ошибки.
Примеры работы:
1) Сервер обрывает соединение
```bash
$ nc -l localhost 4242
Hello from NC
I'm telnet client
Bye, client!
^C
```
```bash
$ go-telnet --timeout=5s localhost 4242
...Connected to localhost:4242
Hello from NC
I'm telnet client
Bye, client!
Bye-bye
...Connection was closed by peer
```
Здесь сообщения
```
Hello from NC
Bye, client!
```
и операция Ctrl+C (Unix) относятся к `nc`,
а сообщения
```
I'm telnet client
Bye-bye
```
относятся к `go-telnet`.
2) Клиент завершает ввод
```bash
$ go-telnet localhost 4242
...Connected to localhost:4242
I
will be
back!
^D
...EOF
```
```bash
$ nc -l localhost 4242
I
will be
back!
```
Здесь сообщения
```
I
will be
back!
```
и операция Ctrl+D (Unix) относятся к `go-telnet`,
Сообщения
```
...Connected to localhost:4242
...Connection was closed by peer
...EOF
```
являются служебными.
Они **выводятся в STDERR** и не тестируются `test.sh`, их формат на усмотрение автора.
### Критерии оценки
- Пайплайн зелёный - 4 балла
- Добавлены юнит-тесты - до 2 баллов
- Понятность и чистота кода - до 4 баллов
#### Зачёт от 7 баллов
### Подсказки
- Для ручного тестирования рекомендуется использовать nc (как в `test.sh`).
- `flag.DurationVar`
- `net.JoinHostPort`, `net.DialTimeout`
- `bufio` / `io`
- `signal.NotifyContext`
- https://stackoverflow.com/questions/51317968/write-on-a-closed-net-conn-but-returned-nil-error