Понимание спецификации 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