This repository has been archived by the owner on Sep 9, 2021. It is now read-only.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Задача реализована на языке – С. Для сборки кода использовать сценарий сборки для Make или CMake. Для организации работы с несколькими клиентами использовать потоки. Для блокировки общих между несколькими клиентами ресурсов использовать примитивы синхронизации.
TCP (Transmission Control Protocol) — протокол транспортного уровня, отвечающий за гарантированную доставку данных от одного узла сети к другому. Гарантированность доставки в TCP достигается за счет использования механизмов подтверждений и повторов. После передачи порции данных отправитель ждет подтверждения от получателя о доставке. Если подтверждение не приходит, выполняется повторная отправка.
Передаче данных между двумя сетевыми приложениями предшествует установка TCP-соединения. По завершении обмена соединение закрывается. Соединение уникально идентифицируется парой значений IP-адреса хоста, номер порта приложения. Приложение, инициирующее соединение (клиент), каждый раз получает в ОС произвольный номер порта и освобождает его после завершения сеанса передачи данных. Приложение, ожидающее соединений (сервер), всегда использует постоянный номер порта, пока не завершит свою работу.
Клиент:
Задача реализована на языке Си. Описание клиента: Клиент позволяет отправлять и принимать сообщения от других пользователей. Отправка сообщений происходит в основном потоке программы, а чтение сообщений с сервера в другом потоке. Так же программа содержит несколько режимов работы:
Режим ввода сообщений: при этом поток на чтение сообщений с сервера блокируются до конца ввода сообщений. Но сообщения от других клиентов с сервера продолжают поступать на клиент, но не отображаются на экране, а сохраняются в буфер.
Режим вывода сообщений: выводит все сообщения, приходящие с сервера от других клиентов, при этом предварительно выводятся все сообщения из буфера.
В файле main.c представлены основные функции клиента:
Установление соединения с сервером
Получение сообщений с сервера
Передача сообщения всем клиентам
Передача сообщения указанному клиенту
Прием сообщения от сервера с последующей индикацией
Разрыв соединения
Сервер:
Исполняемому файлу в качестве аргумента командной строки передаётся номер порта для прослушивания. Сервер с помощью серверного сокета слушает и принимает входящие соединения. В момент коннекта нового клиента сервер смотрит есть ли свободное место в массиве клиентов, если место свободное есть, создается экземпляр структуры клиента и добавляется новый клиент для общей рассылки принятых сообщений всем клиентам. Так же каждый отдельный клиент имеет свой поток. Каждый отдельный клиент выполнятся в своем потоке и в основном просто принимает сообщения с клиента и отправляет на рассылку всем остальным кроме себя.
В момент подключения новых клиентов другие потоки блокируются пока новый клиент не завершит процедуру подключения. Этот механизм реализован с помощью простейших средств синхронизации unix – мьютексов