Главная страница Взаимодействие нетривиальных процессов Параметр -С говорит rpcgen о необходимости создания прототипов функций ANSI С в заголовочном файле square. h. Программа rpcgen также создает заглушку клиента (client stub) в файле с именем square cl nt. с и файл с именем squaге хс1г. с, который осуществляет преобразование данных в соответствии со стандартом XDR. Наша библиотека (содержащая функции, используемые в этой книге) называется libunpipc.a, а параметр -Insl подключает системную библиотеку сетевых функций в Solaris (включая библиотеки RPC и XDR времени выполнения). Аналогичные команды используются для создания сервера, хотя rpcgen уже не нужно запускать снова. Файл square svc.c содержит функцию main сервера, и файл square xclr.o, обсуждавшийся выше, также требуется для работы сервера: Solaris X сс -с server.с -о server.о Solaris X сс -с square svc.c -о square svc.o Solaris X сс -о server server.о square svc.o libunpipc.a -Insl При этом создаются клиент и сервер, выполняемые в системе Solaris. Если клиент и сервер должны быть построены для разных систем (как в предыдущем примере, где клиент выполнялся в Solaris, а сервер - в BSD/OS), могут потребоваться дополнительные действия. Например, некоторые файлы должны быть либо общими (через NFS), либо находиться в обеих системах, а файлы, используемые клиентом и сервером (например, square xclr.o), должны компилироваться в каждой системе в отдельности. На рис. 16.1 приведена схема создания приложения типа клиент-сервер. Три затемненных прямоугольника соответствуют файлам, которые мы должны написать. Штриховые линии показывают файлы, подключаемые через заголовочный файл square, h. файл спецификации RPC client
server функция сервера исполняемый файл исполняемый файл Рис. 16.1. Этапы создания приложения клиент-сервер с использованием RPC На рис. 16.2 изображена схема происходящего при удаленном вызове процедуры. Действия выполняются в следующем порядке: 1. Запускается сервер, который регистрируется в программе, управляющей портами на узле-сервере. Затем запускается клиент и вызывает clnt create. Эта функция связывается с управляющей портами программой сервера и находит нужный порт. Функция clnt create также устанавливает соединение с сервером по протоколу TCP (поскольку мы указали TCP в качестве используемого протокола в листинге 16.2). Мы не показываем эти щаги на рисунке и откладываем детальное обсуждение до раздела 16.3. 2. Клиент вызывает локальную процедуру, называемую заглущкой клиента. В листинге 16.2 эта процедура называлась squareproc l, а файл, содержащий ее, создавался rpcgen автоматически и получал название square clnt.c. С точки зрения клиента именно эта функция является сервером, к которому он обращается. Целью создания заглущки является упаковка аргументов для удаленного вызова процедуры, помещение их в стандартный формат и создание одного или нескольких сетевых сообщений. Упаковка аргументов клиента в сетевое сообщение называется сортировкой (marshaling). Клиент и заглущка обычно вызывают библиотеки функций RPC (clntcreate в нащем примере). При использовании редактора связей в Solaris эти функции загружаются из библиотеки -1 nsl, тогда как в BSD/OS они входят в стандартную библиотеку языка С. 3. Сетевые сообщения отсылаются на удаленную систему заглущкой клиента. Обычно это требует локального системного вызова (например, write или senflto). 4. Сетевые сообщения передаются на удаленную систему. Для этого обычно используются сетевые протоколы TCP и UDP. 5. Заглущка сервера ожидает запросов от клиента на стороне сервера. Она рассортировывает аргументы из сетевых сообщений. 6. Заглущка сервера осуществляет локальный вызов процедуры для запуска настоящей функции сервера (процедуры squareproc l svc в листинге 16.3), передавая ей аргументы, полученные в сетевых сообщениях от клиента. 7. После заверщения процедуры сервера управление возвращается заглущке сервера, которой передаются все необходимые значения. 8. Заглущка сервера преобразовывает возвращаемые значения к нужному формату и рассортировывает их в сетевые сообщения для отправки обратно клиенту. 9. Сообщения передаются по сети обратно клиенту. 10. Заглущка клиента считывает сообщения из локального ядра (вызовом read или recvf гот). 11. После возможного преобразования возвращаемых значений заглущка клиен -та передает их функции клиента. Этот этап воспринимается клиентом как за-верщение работы процедуры. процесс-клиент процесс-сервер локальный вызов процедуры square clnt.c square xdr,c (10) заглушка клиента библиотека RPC системный вызов (2) процесс ядро сетевые профзммы
заглушка сервера библиотека RPC (3) сетевое соединение сетевые профзммы server.c square svc.c square xdr,c процесс ядро Рис. 16.2. Действия, происходящие при удаленном вызове процедуры История Наверное, одна из самых старых книг по RPC - это [26]. Как пищет [4], Уайт (White) затем перещел в Xerox и там создал несколько систем RPC. Одна из них была выпущена в качестве отдельного продукта в 1981 году под именем Courier. Классической книгой по RPC является [2]. В ней описаны средства RPC проекта Cedar, работавшего на однопользовательских рабочих станциях Dorado в фирме Xerox в начале 80-х. Xerox реализовал RPC на рабочих станциях еще до того, как большинство людей узнало о том, что рабочие станции существуют! Реализация Courier для Unix распространялась много лет с версиями BSD 4.x, но в настоящий момент эта система RPC представляет только исторический интерес. Sun выпустила первую версию пакета RPC в 1985. Она была разработана Бобом Лайоном (Bob Lyon), ушедшим в Sun из фирмы Xerox в 1983. Официально она называлась ONC/RPC: Open Network Computing Remote Procedure Call (удаленный вызов процедур в открытых вычислительных сетях), но обычно ее называют просто Sun RPC. Технически она аналогична Courier. Первые версии Sun RPC были написаны с использованием интерфейса сокетов и работали с протоколами TCP и UDP. Общедоступный исходный код вышел под названием RPCSRC. В начале 90-х он был переписан под интерфейс транспортного уровня TLI (предшественник XTI), который описан в четвертой части [24]. Теперь этот код работает со всеми протоколами, поддерживаемыми ядром. Общедоступный исходный код обеих версий можно найти по адресу ftp: playground.sun.com/pub/rpc, причем версия, использующая сокеты, называется rpcsrc, а версия, использующая TLI, называется ti rpcsrc (название TI-RCP образовано от Transport Independent - транспортно-независимый удаленный вызов процедур). Стандарт RFC 1831 [18] содержит обзор средств Sun RPC и описывает формат сообщений RPC, передаваемых по сети. Стандарт RFC 1832 [19] содержит
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |