## Домашнее задание №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