2016-01-09 2 views
0

У меня есть упражнение для создания простой программы server-client с использованием rpcgen.rpcgen добавляет расширение _svc

Я пишу этот ex7.x файл:

program REMOTE_PROG { 
    version MSG_RCV { 
     int STRLEN(string)  = 1; 
     double SQUARE(double *) = 2; 
     int NUM_OF_DEV(int *) = 3; 

    } = 1; 
} = 99; 

выполняющихся с rpcgen ex7.x -> генерирует ex7_svc.c.

в файле ex7_svc.c, по какой-то причине, он генерирует каждую функцию случай с _svc расширения:

case STRLEN: 
    xdr_argument = xdr_wrapstring; 
    xdr_result = xdr_int; 
    local = (char *(*)()) strlen_1_svc; //<--_SVC 
    break; 

и когда я пытаюсь скомпилировать сервер после реализации функций

int * strlen_1(char **, CLIENT *); 

компилятор повышает эту погрешность:

"_strlen_1_svc", referenced from: 
    _remote_prog_1 in ex7_svc-8501b7.o 
ld: symbol(s) not found for architecture x86_64 

Но если я удалю это автоматически созданное расширение _svc, local = (char *(*)()) strlen_1; //no _svc программа скомпилируется успешно.

Почему это происходит? почему rpcgen добавляет расширение _svc к функциям, и я делаю что-то неправильно, когда я удаляю _svc?


P.S такой же ошибки также для функций square и num_of_dev, например, даны только strlen.

Спасибо!

ответ

1

Это соглашение, _svc является коротким для обслуживания.

Ваш сервер должен реализовать служебную функцию, то есть функцию strlen_1_svc.

Ваш клиент вызывает функцию strlen_1. rpcgen + библиотека RPC выполняет все промежуточные операции - генерирует код для strlen_1, используемый клиентом, который будет сериализовать данные и передать их на сервер, где цикл событий отправляет вызов вашему коду в функции strlen_1_svc.

+0

спасибо, получилось! (случайно удаленный комментарий: , поэтому мне нужно реализовать 'int * strlen_1_svc (char **, struct svc_req *);' вместо 'int * strlen_1 (char **, CLIENT *);'?); –

0

После выполнения rpcgen ex7.x вы должны быть созданы клиентские и серверные заглушек ex7_clnt.c и ex7_svc.c, а также файл заголовка ex7.h

В файле заголовка вы объявивших обе функции strlen_1 и strlen_1_svc, они должны иметь разные имена поскольку они являются разными функциями: первый из них находится на стороне клиента и вызывает второй на стороне сервера через вызов RPC.

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