Skip to content
This repository has been archived by the owner on Sep 9, 2021. It is now read-only.

Zaretskaya Lisa, lab1a, /70203 #126

Closed
wants to merge 3 commits into from

Conversation

Zaretskaya
Copy link

Задача реализована на языке – С. Для сборки кода использовать сценарий сборки для Make или CMake. Для организации работы с несколькими клиентами использовать потоки. Для блокировки общих между несколькими клиентами ресурсов использовать примитивы синхронизации.

TCP (Transmission Control Protocol) — протокол транспортного уровня, отвечающий за гарантированную доставку данных от одного узла сети к другому. Гарантированность доставки в TCP достигается за счет использования механизмов подтверждений и повторов. После передачи порции данных отправитель ждет подтверждения от получателя о доставке. Если подтверждение не приходит, выполняется повторная отправка.

Передаче данных между двумя сетевыми приложениями предшествует установка TCP-соединения. По завершении обмена соединение закрывается. Соединение уникально идентифицируется парой значений IP-адреса хоста, номер порта приложения. Приложение, инициирующее соединение (клиент), каждый раз получает в ОС произвольный номер порта и освобождает его после завершения сеанса передачи данных. Приложение, ожидающее соединений (сервер), всегда использует постоянный номер порта, пока не завершит свою работу.

Клиент:

Задача реализована на языке Си. Описание клиента: Клиент позволяет отправлять и принимать сообщения от других пользователей. Отправка сообщений происходит в основном потоке программы, а чтение сообщений с сервера в другом потоке. Так же программа содержит несколько режимов работы:

  1. Режим ввода сообщений: при этом поток на чтение сообщений с сервера блокируются до конца ввода сообщений. Но сообщения от других клиентов с сервера продолжают поступать на клиент, но не отображаются на экране, а сохраняются в буфер.

  2. Режим вывода сообщений: выводит все сообщения, приходящие с сервера от других клиентов, при этом предварительно выводятся все сообщения из буфера.

В файле main.c представлены основные функции клиента:

  • Установление соединения с сервером

  • Получение сообщений с сервера

  • Передача сообщения всем клиентам

  • Передача сообщения указанному клиенту

  • Прием сообщения от сервера с последующей индикацией

  • Разрыв соединения

image

Сервер:

Исполняемому файлу в качестве аргумента командной строки передаётся номер порта для прослушивания. Сервер с помощью серверного сокета слушает и принимает входящие соединения. В момент коннекта нового клиента сервер смотрит есть ли свободное место в массиве клиентов, если место свободное есть, создается экземпляр структуры клиента и добавляется новый клиент для общей рассылки принятых сообщений всем клиентам. Так же каждый отдельный клиент имеет свой поток. Каждый отдельный клиент выполнятся в своем потоке и в основном просто принимает сообщения с клиента и отправляет на рассылку всем остальным кроме себя.

В момент подключения новых клиентов другие потоки блокируются пока новый клиент не завершит процедуру подключения. Этот механизм реализован с помощью простейших средств синхронизации unix – мьютексов

@ejiektpobehuk ejiektpobehuk changed the title Zaretskaya Lisa, lab3a, /70203 Zaretskaya Lisa, lab1a, /70203 Feb 28, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants