Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

ВЗАИМОДЕЙСТВИЕ ПРОЦЕССОВ ЧЕРЕЗ СОКЕТЫ




Цель работы -знакомство студентов с механизмом взаимодействия удаленных процессов – сокетами и с системными вызовами, обеспечивающими установление соединения, разъединение, а также передачу и прием данных.

Общие сведения

Сокеты представляют собой программный интерфейс, который предоставляется операционной системой для взаимодействия удаленных процессов.

В зависимости от выбираемых параметров сокеты могут поддерживать локальные соединения, протоколы Интернет, протоколы Novell, Х.25 и другие.

Сокеты поддерживают обмен сообщениями с установлением соединения (протокол ТСР), обеспечивающий надежную упорядоченную передачу сообщений, и обмен сообщениями без установления соединения (протокол UDP), обеспечивающий ненадежную передачу сообщений, которые могут теряться, и порядок поступления которых может быть нарушен.

Сокет создается следующим вызовом:

int socket(int domain, int type, int protocol),

где domain. – определяет тип коммуникационного протокола (Интернет, Novell, Х.25); type – определяет тип передачи (надежная, ненадежная); protocol – конкретизация типа коммуникационного протокола.

К сокету, который на сервере будет выполнять функцию прослушивания, привязывается адрес следующим вызовом:

int bind(int s,

struct sockaddr *addr,

socklen_t addrlen),

где s – дескриптор сокета; addr – указатель на структуру, содержащую адрес, к которому привязывается сокет; addrlen – размер структуры.

Перевод сокета в состояние прослушивания осуществляется вызовом:

int listen(int s, int backlog),

где s – дескриптор сокета; backlog – размер очереди соединений с клиентами.


Прием первого соединения из очереди соединений с клиентами осуществляется вызовом:

int accept(int s,

struct sockaddr *addr,

socklen_t *addrlen),

где s – дескриптор слушающего сокета; addr – указатель на структуру, содержащую адрес клиента; addrlen – размер структуры.

Установление соединения с сервером осуществляется вызовом:

int connect(int s,

const struct sockaddr *addr,

socklen_t addrlen),

где s – дескриптор сокета; addr – указатель на структуру, содержащую адрес сервера; addrlen – размер структуры.

Передача данных в сокет осуществляется следующим вызовом:

int send(int s, const void *msg, size_t len, int flags),

где s – дескриптор сокета; msg – адрес буфера, содержащего данные для передачи; len – размер передаваемых данных; flags – флаги, описывающие особенности передачи.

Прием данных из сокета производится вызовом:

int recv(int s, void *buf, size_t len, int flags),

где s – дескриптор сокета; buf - адрес буфера, в который принимаются данные; len – размер буфера; flags – флаги, описывающие особенности приема.


Указания к выполнению работы

Написать комплект из двух программ, одна из которых выполняет функции сервера, а вторая выполняет функции клиента.

Клиент после установления соединения с сервером посылает ему запросы.

Сервер принимает запросы, обрабатывает их и отправляет ответы клиенту. Функцию обработки следует выбрать самостоятельно.

Клиент принимает ответы и выводит их на экран.

Использовать функции работы с сокетами без блокировки.

 

Шаблон программы-сервера представлен ниже:

 

объявить идентификатор «слушающего» сокета;

объявить идентификатор сокета для работы с клиентом;

объявить идентификатор очереди запросов на обработку;

объявить идентификатор очереди ответов на передачу;

объявить флаг завершения потока приема запросов;

объявить флаг завершения потока обработки запросов;

объявить флаг завершения потока передачи ответов;

объявить флаг завершения потока ожидания соединений;

Функция приема запросов()

{

Пока (флаг завершения потока приема не установлен)

{

принять запрос из сокета;

положить запрос в очередь на обработку;

}

}

Функция обработки запросов()

{

Пока (флаг завершения потока обработки не установлен)

{

прочитать запрос из очереди на обработку;

обработать запрос и сформировать ответ;

положить ответ в очередь на передачу;

}

}

Функция передачи ответов()

{

Пока (флаг завершения потока передачи не установлен)

{

прочитать ответ из очереди на передачу;

передать ответ в сокет;

}

}

Функция ожидания соединений()

{

Пока (флаг завершения потока ожидания соединений не установлен)

{

прием соединения от клиента;

Если соединение принято

{

создать поток приема запросов;

создать поток обработки запросов;

создать поток передачи ответов;

завершить работу потока ожидания соединений;

}

}

}

Основная программа()

{

объявить идентификатор потока приема запросов;

объявить идентификатор потока обработки запросов;

объявить идентификатор потока передачи ответов;

объявить идентификатор потока ожидания соединений;

создать «слушающий» сокет;

привязать «слушающий» сокет к адресу;

перевести сокет в состояние прослушивания;

создать очередь запросов на обработку;

создать очередь ответов на передачу;

создать поток ожидания соединений;

ждать нажатия клавиши;

установить флаг завершения потока приема запросов;

установить флаг завершения потока обработки запросов;

установить флаг завершения потока передачи ответов;

установить флаг завершения потока ожидания соединений;

ждать завершения потока приема запросов;

ждать завершения потока обработки запросов;

ждать завершения потока передачи ответов;

ждать завершения потока ожидания соединений;

закрыть соединение с клиентом;

закрыть сокет для работы с клиентом;

закрыть «слушающий» сокет;

}

 

Шаблон программы-клиента представлен ниже:

 

Объявить сокет для работы с сервером

объявить флаг завершения потока установления соединения;

объявить флаг завершения потока передачи запросов;

объявить флаг завершения потока приема ответов;

Функция передачи запросов()

{

Пока (флаг завершения потока передачи запросов не установлен)

{

задержка на время;

создать запрос;

передать запрос в сокет;

}

}

Функция приема ответов()

{

Пока (флаг завершения потока приема ответов не установлен)

{

принять ответ из сокета;

вывести ответ на экран;

}

}

Функция установления соединения()

{

Пока (флаг завершения потока установления соединения не установлен)

{

установить соединение с сервером;

Если соединение установлено

{

создать поток передачи запросов;

создать поток приема ответов;

завершить работу потока;

}

}

}

Основная функция()

{

объявить идентификатор потока установления соединения;

объявить идентификатор потока передачи запросов;

объявить идентификатор потока приема ответов;

создать сокет для работы с сервером;

создать поток установления соединения;

ждать нажатия клавиши;

установить флаг завершения потока передачи запросов;

установить флаг завершения потока приема ответов;

установить флаг завершения потока установления соединения;

ждать завершения потока установления соединения;

ждать завершения потока передачи запросов;

ждать завершения потока приема ответов;

закрыть соединение с сервером;

закрыть сокет;

}



Вопросы для самопроверки

1. Каким образом обеспечить одновременную работу сервера с несколькими клиентами?

2. Каким образом обеспечить работу клиента с многократным соединением и разъединением с сервером?

3. Каким образом обеспечить работу программ сервера и клиента без блокировки функций приема, ожидания и установления соединения?

4. Как на стороне сервера определить адрес клиента, который установил соединение?

5. Как обеспечить обмен сообщениями между двумя программами через сокеты без установления соединения?

6. Какие прикладные протоколы, основанные на протоколах TCP и UDP, существуют?

7. Как обработать случай, когда вторая сторона некорректно разрывает соединение?

8. Обоснуйте целесообразность вызова функций accept() и connect() в отдельных потоках.

9. Какие параметры сокета необходимо использовать для осуществления обмена данными между локальными процессами?

 



Заключение

Работы выполняются индивидуально. Отчет представляется в электронном виде.

Отчет должен содержать описание средства взаимодействия процессов, изучаемого в данной лабораторной работе, подробное описание системных вызовов, используемых в программе, параметров, передаваемых в эти вызовы, текст работающей программы с содержательными комментариями и результаты работы программ.

Защита каждой работы включает в себя следующие этапы:

1. Студент предъявляет отчет по лабораторной работе;

2. Студент демонстрирует следующие умения:

§ умение запустить программу;

§ умение внести изменение в текст программы (требуемые изменения преподаватель фиксирует в отчете);

§ умение пересобрать программу и снова ее запустить.

3. Студент отвечает на дополнительные вопросы.










Последнее изменение этой страницы: 2018-04-12; просмотров: 598.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...