Case '3'://Просмотреть 5 записей

recv(s,buf,sizeof(buf),0);printf("%s",buf);

recv(s,buf,sizeof(buf),0);printf("%s",buf);

recv(s,buf,sizeof(buf),0);printf("%s",buf);

recv(s,buf,sizeof(buf),0);printf("%s",buf);

recv(s,buf,sizeof(buf),0);printf("%s",buf);

break;

Case '4'://Выход

exit(0);

}

}

}

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

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

После возврата управления из функции accept() ведущий процесс сервера создает ведомый процесс для обслуживания соединения. Для этого ведущий процесс вызывает функцию fork(), чтобы разделиться на два процесса. Поток во вновь созданном дочернем процессе вначале закрывает сокет ведущего процесса, а затем вызывает функцию Func() для обслуживания соединения. Поток в родительском процессе закрывает сокет, который был создан для обслуживания нового соединения, и продолжает выполнение бесконечного цикла. При следующем проходе по циклу ведущий процесс после вызова функции accept() снова переходит в состояние ожидания очередных запросов на установление соединения. Следует отметить, что и первоначальный, и новые процессы имеют доступ к открытым сокетам после вызова функции fork() и, что они оба должны закрыть один из этих сокетов, после чего система освобождает связанный с ним ресурс. Поэтому этот сокет закрывается только в ведущем процессе после вызова функции close() потоком ведущего процесса для закрытия сокета нового соединения. Аналогичным образом, когда поток в ведомом процессе вызывает функцию close() для закрытия сокета ведущего процесса, этот сокет закрывается только в ведомом процессе. Ведомый процесс продолжает получать доступ к сокету нового соединения до тех пор, пока не завершит свою работу, а ведущий сервер продолжает иметь доступ к сокету, который соответствует общепринятому порту.

После закрытия сокета ведущего процесса ведомый процесс вызывает процедуру Func(). После возврата управления процедурой Func() ведомый процесс использует возвращенное значение в качестве параметра вызова функции exit. Система Linux интерпретирует вызов функции exit как требование завершить процесс и использует параметр вызова этой функции как код завершения процесса. В соответствии с общепринятым соглашением, в процессе для обозначения нормального завершения используется код завершения нуль. После прекращения работы ведомого процесса операционная система автоматически закрывает все его открытие дескрипторы, в том числе дескриптор соединения ТСР.




Контрольные вопросы

1. По какой причине последовательная реализация сервера, может оказаться неудовлетворительной?

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

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

4. Для чего используется блокирующий вызов функции accept()?

5. Когда и для чего вызывается функция fork()?

6. Каким образом решается проблема не полностью завершившихся процессов (процессов, информация о которых остается в системных таблицах)?

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

Варианты индивидуального задания

1. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список о студентов. Каждая запись списка содержит следующую информацию о студенте

- Ф.И.О. студента;

- номер группы;

- размер стипендии;

- оценки по N предметам.

Таких записей должно быть не менее 5.

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

2. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список о студентов. Каждая запись списка содержит следующую информацию о студенте

- Ф.И.О. студента;

- номер группы;

- размер стипендии;

- оценки по N предметам.

Таких записей должно быть не менее 5.

Клиент посылает на сервер средний балл студента, по которому он хочет получить информацию о студентах. Назад он получает список только тех студентов, средний балл которых больше заданного.

3. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список о студентов. Каждая запись списка содержит следующую информацию о студенте

- Ф.И.О. студента;

- номер группы;

- размер стипендии;

- оценки по N предметам.

Таких записей должно быть не менее 5.

По запросу клиента он получает от сервера список только тех студентов, которые не имеют оценки 3.

4. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список сотрудников фирмы. Каждая запись списка содержит следующую информацию о сотрудниках

- Ф.И.О. сотрудника;

- табельный номер;

- количество отработанных часов за месяц;

- почасовой тариф.

Таких записей должно быть не менее 5.

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

5. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится информация (список) о комплектующих деталях. Каждая запись списка содержит следующую информацию о комплектующем

- завод-поставщик;

- стоимость;

- дата поставки;

Таких записей должно быть не менее 7.

Клиент посылает на сервер дату поставки. Назад он получает список комплектующих поставленных именно на эту дату и стоимость каждого возвращаемого комплектующего должна превосходить минимальную во всем списке.

6. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список автобусных рейсов. Каждая запись списка содержит следующую информацию о рейсе

- номер рейса;

- тип автобуса;

- цена билета;

- пункт назначения.

Таких записей должно быть не менее 5.

Клиент посылает на сервер пункт назначения. Назад он получает список рейсов, позволяющих добраться до заданного пункта.

7. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список игроков. Каждая запись списка содержит следующую информацию об игроках

- Ф. И. О. игрока;

- игровой номер;

- возраст;

- рост;

- вес.

Таких записей должно быть не менее 5.

Клиент посылает на сервер запрос и получает информацию о самом молодом игроке.

8. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список разговоров на междугородней АТС. Каждая запись списка содержит следующую информацию о разговорах

- дату разговора;

- код и название города;

- продолжительность разговора;

- тариф;

- номер телефона в этом городе;

- номер телефона абонента.

Таких записей должно быть не менее 5.

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

9. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список товаров, имеющихся на складе. Каждая запись списка содержит следующую информацию о товарах

- страна-изготовитель;

- фирма-изготовитель;

- наименование товара;

- количество единиц товара.

Таких записей должно быть не менее 5.

Клиент посылает на сервер страну-изготовитель. Назад он получает товары и их данные для указанной страны.

10. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список книг, хранящихся в библиотеке. Каждая запись списка содержит следующую информацию о книгах

- регистрационный номер книги,

- автор;

- название;

- год издания;

- издательство;

- количество страниц.

Таких записей должно быть не менее 5.

Клиент посылает на сервер фамилию интересующего его автора. Назад он получает список книг указанного автора.

11. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список деталей. Каждая запись списка содержит следующую информацию о деталях

- наименование детали;

- количество деталей;

- номер цеха, где они изготовлены.

Таких записей должно быть не менее 7.

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

12. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список товаров, имеющихся на складе. Каждая запись списка содержит следующую информацию о товарах

- страна-изготовитель;

- фирма-изготовитель;

- наименование товара;

- количество единиц товара.

Таких записей должно быть не менее 5.

Клиент посылает на сервер наименование товара. Назад он получает количество единиц этого товара.

13. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится каталог туристических предложений. Каждая запись каталога содержит:

- название тура

- стоимость

- продолжительность

- вид транспорта

Таких записей должно быть не менее 5.

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

14. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится список преподавателей. Каждая запись списка содержит:

- Ф.И.О.

- ученая степень

- стаж работы

- предмет

Клиент посылает на сервер название предмета. Назад он получает Ф.И.О. тех преподавателей этого предмета, стаж работы которых не менее 5 лет.

15. Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP. Реализовать параллельное соединение с использованием отдельного процесса для обработки каждого запроса. На сервере хранится информация об участниках соревнований по спортивным танцам. Она включает:

- название танцевальной пары

- город

- оценка жюри

- оценка зрителей

- возрастная группа

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

Наши рекомендации