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



{

сформировать сообщение в буфере;

записать сообщение из буфера в очередь сообщений;

задержать на время;

}

}

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

{

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

создать (или открыть, если существует) очередь сообщений;

создать поток из функции потока;

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

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

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

закрыть очередь сообщений;

удалить очередь сообщений;

}

 

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

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

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

Функция потока()

{

объявить буфер;

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

{

очистить буфер сообщения;

принять сообщение из очереди сообщений в буфер;

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

}

}

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

{

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

создать (или открыть, если существует) очередь сообщений;

создать поток из функции потока;

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

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

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

закрыть очередь сообщений;

удалить очередь сообщений;

}


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

1. Какие программные интерфейсы для работы с очередями сообщений существуют?

2. Дайте сравнительную характеристику программных интерфейсов очередей сообщений.

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

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

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

6. Каким образом можно менять размер сообщений и количество сообщений в очереди?


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

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

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

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

В зависимости от выбираемых параметров сокеты могут поддерживать локальные соединения, протоколы Интернет, протоколы 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 – флаги, описывающие особенности приема.

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

{


Дата добавления: 2018-04-05; просмотров: 432; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!