[к списку]

Port forwarder

Реализовать программу для перенаправления TCP-соединений ("port forwarder"), используя неблокирующиеся сокеты.
  1. В параметрах программе передаются <lport> <rhost> <rport>
  2. Форвардер ждёт TCP-соединений на порту <lport>.
  3. При подключении клиента форвардер открывает новое TCP-соединение на <rhost>:<rport> и пересылает данные в обе стороны без изменений.
  4. В случае невозможности установить соединение с <rhost>:<rport>, форвардер закрывает соединение с клиентом, не передавая ему никаких данных.
  5. Для реализации форвардера использовать неблокирующиеся сокеты, работая с ними в рамках одного треда. Дополнительные треды использовать не допускается. Соответственно, никаких блокирующихся вызовов (кроме вызова селектора) не допускается.
    • Поскольку в стандартной библиотеке Java нет неблокирующегося резолвинга DNS-имён (но это можно решить с помощью внешних библиотек), то для простоты можно резолвить имя один раз при старте программы. Если имя не резолвится, завершать работу программы.
  6. Форвардер не должен делать предположений о том, какой протокол уровня приложений будет использоваться внутри перенаправляемого TCP-соединения. В частности, должна поддерживаться передача данных одновременно в обе стороны, а соединения должны закрываться аккуратно (только после того, как они больше не нужны).
  7. В приложении не должно быть холостых циклов ни в каких ситуациях. Другими словами, не должно быть возможно состояние программы, при котором неоднократно выполняется тело цикла, которое не делает ни одной фактической передачи данных за итерацию.
  8. Не допускается неограниченное расходование памяти для обслуживания одного клиента.
  9. Производительность не должна быть заметно хуже, чем без форвардера. Для отслеживания корректности и скорости работы можно глядеть в Developer tools браузера на вкладку Network.
Для тестирования работы форвардера направить его на какой-нибудь веб-сайт, богатый на картинки (по ним удобно наглядно видеть проблемы). Например, можно использовать http://fit.ippolitov.me/gallery/, для этого надо запустить форвардер с параметрами: lport=10080, rhost=fit.ippolitov.me, rport=80, а затем открыть в браузере http://127.0.0.1:10080/gallery/. Обратите внимание, что картинки будут кешироваться браузером, поэтому для принудительного обновления можно использовать Ctrl+F5.

Баллов за задачу: 2.