Понимание спецификации XDR для создания файла *.x

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

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

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

[rohit@ganglia-server rpc]$ rpcgen -C gm_protocol.x 
[rohit@ganglia-server rpc]$ 
[rohit@ganglia-server 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 и т. Д.).

Пожалуйста, помогите узнать эти характеристики.

1 ответ

Решение

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

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:

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

Другие вопросы по тегам