2014-10-28 3 views
2

Я искал через несколько веб-сайтов в Интернете и на самом деле хотели бы знать, как мы пишем спецификации в файле .x генерировать эквивалентные функции в .c файл для RPC. Каждый сайт, я посетил предложил использовать следующий вид спецификации в * .x файл:Понимание спецификации XDR создать * .x файл

program ADD_PROG { 
    version ADD_VERS { 
     int ADD(intpair) = 1; 
    } = 1; 
} = 0x23451111; 

Таким образом, чтобы понять практически, я получил gm_protocol.x из открытого источника проекта, известный как ганглии и сгенерированный исходный код эквивалентен C (gm_protocol_xdr.c) и заголовочный файл C (gm_protocol.h) с использованием rpcgen.

[[email protected] rpc]$ rpcgen -C gm_protocol.x 
[[email protected] rpc]$ 
[[email protected] rpc]$ ll 
total 24 
-rw-rw-r-- 1 rohit rohit 5786 Oct 28 17:52 gm_protocol.h 
-rw-rw-r-- 1 rohit rohit 3485 Oct 28 15:04 gm_protocol.x 
-rw-rw-r-- 1 rohit rohit 8213 Oct 28 17:52 gm_protocol_xdr.c 

К моему удивлению, от того, что я узнал и понял, gm_protocol.x не содержит таких RPC спецификации, указанные в коде выше, но все же он может генерировать слишком много функций в файле gm_protocol_xdr.c.

Я уверен, что я не могу понять спецификации XDR, потому что либо я консультировался с неправильными источниками, либо они устарели. Я не мог найти учебник, который мог бы объяснить способ генерации функций (хотя я нашел спецификации для создания struct, enum, union и т. Д.).

Пожалуйста, помогите изучить эти спецификации.

ответ

3

Как правило, из .x файла вы генерируете три «группы» кода: функции xdr кодировщика/декодера, заглушку клиента и заглушку сервера (ну, вы также можете это сделать вручную, но это слишком большая работа, чтобы получить это правильно). Запуск rpcgen с параметром -a также создает клиент, серверный подход и пример реализации. Попробуйте использовать простой пример первый:

program STRLEN { 
    version STRLENVERS { 
    int strlen(string) = 1; 
    } = 1; 
} = 117; 

Спецификация program является частью RPCL, но язык XDR. Если один ставит выше спецификации в test.x файл и запустить его с помощью rpcgen -C test.x, то он/она будет просто получить

test.h, test_svc.c, test_clnt.c

Если вам не нужны какие-либо серверные или клиентские заглушки и просто нужны функции кодировщика и декодера XDR, тогда все спецификации, такие как enum, struct, union и т. Д. В файле gm_protocol.x будут сгенерированы в их эквивалентные объявления на основе C в gm_protocol.h и их соответствующие функции кодера и декодера XDR будут генерироваться в gm_protocol_xdr.c, что и задано в вопросе.

Запуск rpcgen -a gm_protocol.x будет генерировать gm_protocol_svc.c и gm_protocol_clnt.c без каких-либо функций.

Ниже приведены некоторые характеристики XDR:

enter image description here

Проверьте старый SUN DOCU http://www.shrubbery.net/solaris9ab/SUNWdev/ONCDG/toc.html

+0

Ссылка, кажется, быть полезным, но это не ответ на мой вопрос. Мой вопрос: ** gm_protocol.x ** не содержит никакой спецификации как «программа STLEN {', но все же rpcgen может создавать ** gm_protocol_xdr.c ** файл, содержащий функции. В соответствии с «Unix Network Programming Vol 2 от Richard Stevens»: ** В спецификации RPC (RFC 1831) говорится, что язык RPC, иногда называемый RPCL, идентичен языку XDR (который определен в RFC 1832), за исключением для добавления определения программы (которое описывает программу, версии и процедуры). ** Итак, как эти функции созданы здесь? – Rohit

+1

rpcgen генерирует функцию кодера/декодера для любой структуры и перечисления, определенных в файле .x. Кодированное сообщение XDR представляет собой массив байтов, и вам необходимо преобразовать их в соответствующие типы. – kofemann

+1

Это то, что я думал раньше. Таким образом, это означает, что нет необходимости помещать 'program STRLEN {' в файл **. X ** для генерации функций кодировщика/декодера. +1 для этого подтверждения. Я отредактирую ваш ответ и добавлю, что делает ответ полным. Благодарю. – Rohit

Смежные вопросы