Лабораторная работа Многопользовательские приложения на C# Реализуйте полностью децентрализованный протокол маркерного кольца на прикладном уровне. В сети работают несколько приложений, TCP-соединения между которыми образуют кольцо. По кольцу быстро перемещается маркер – небольшой пакет, который может вмещать себя данные, адресованные некоторому приложению кольца. Все приложения имеют идентификаторы, и каждое отображает пользователю все кольцо идентификаторов, с отмеченным текущим узлом. Путь также приложение отображает скорость обхода маркером кольца (количество оборотов в секунду). Каждое приложение поддерживает два постоянных TCP-соединения: с предыдущим и со следующим узлами. В соединении со следующим узлом текущий узел является клиентом (т.е. он подключался к порту следующего), в соединении с предыдущим – сервером (т.е. он прослушивал некоторый порт и подключил предыдущий узел). Когда приложение получает маркер, оно прибавляет к нему данные для отправки, если данные есть и маркер пустой, и отправляет маркер по цепочке дальше. Данные и идентификатор адресата вводятся пользователем. Реализуйте функцию включения приложения в кольцо. Чтобы новое приложение смогло подключиться к кольцу, его пользователь должен знать IP-адрес и порт какого-нибудь участника кольца (это будет следующий узел для текущего). Пользователь указывает эту информацию, а также номер прослушиваемого порта, к которому переподключится предыдущий узел следующего узла. После нажатия кнопки «Подключиться», приложение начинает в отдельном потоке прослушивание порта подключения предыдущего узла и в другом потоке установку соединения с указанным пользователем следующим узлом. Следующий узел сообщает своему предыдущему, что нужно разорвать цепочку и включить в это место новый узел.