ОБЗОР И
ОПИСАНИЕ
Эти
функции
позволяют
программам,
созданным
на Си,
вызывать
удалённые
процедуры
на других
машинах в
сети.
Сначала,
клиент
вызывает
процедуру
путём
отправки
пакета с
данными на
сервер.
После
принятия
пакета
сервер
вызывает
функцию
распределения
(dispatch) для
выполнения
запрошенной
службы и
отсылает
ответ
обратно.
Последним
действием
результат
выполнения
процедуры
возвращается
клиенту.
Чтобы
использовать
эти
функции,
включите
заголовочный
файл <rpc/rpc.h>.
Представленные
ниже
прототипы
позволяют
использовать
следующие
типы:
typedef int bool_t;
typedef bool_t (*xdrproc_t)(XDR *, void *, ...);
typedef bool_t (*resultproc_t)(caddr_t resp,
struct sockaddr_in *raddr);
Объявления
типов AUTH, CLIENT,
SVCXPRT и XDR
смотрите в
заголовочных
файлах.
void auth_destroy(AUTH *auth);
- Макрос,
который
уничтожает
аутентификационную
информацию,
связанную
с auth.
Уничтожение,
обычно,
вызывает
высвобождение
скрытых
структур
данных.
Работа с auth
после
вызова auth_destroy()
не
описана.
AUTH *authnone_create(void);
- Создаёт и
возвращает
аутентификационный
описатель
RPC, который
передаёт
непригодную
аутентификационную
информацию
с каждым
вызовом
удалённой
процедуры.
Данная
аутентификация
используется
в RPC по
умолчанию.
AUTH *authunix_create(char *host, uid_t uid, gid_t gid,
int len, gid_t aup_gids[.len]);
- Создаёт и
возвращает
аутентификационный
описатель
RPC, который
содержит
аутентификационную
информацию.
В
параметре
host
содержится
имя машины,
на которой
была
создана
информация;
в uid
содержится
пользовательский
идентификатор;
в gid
содержится
идентификатор
текущей
группы
пользователя;
значения
len и aup_gids
описывают
обновляемый
(counted) массив
групп, к
которым
принадлежит
пользователь.
Это
упрощает
персонализацию
пользователя.
AUTH *authunix_create_default(void);
- Вызывает
authunix_create() с
соответствующими
параметрами.
int callrpc(char *host, unsigned long prognum,
unsigned long versnum, unsigned long procnum,
xdrproc_t inproc, const char *in,
xdrproc_t outproc, char *out);
- Вызывает
удалённую
процедуру,
связанную
с prognum, versnum и procnum
на машине
host. В
параметре
in
передаётся
адрес
параметров
процедуры,
в out — адрес,
по
которому
должен
помещаться
результат;
inproc
используется
для
кодирования
параметров
процедуры,
а outproc — для
декодирования
результатов.
При
успешном
выполнении
эта
функция
возвращает
0 или целое
значение в
enum clnt_stat при
ошибке. Для
перевода
номера
ошибки в
сообщение
об ошибке
можно
использовать
функцию
clnt_perrno().
- Предупреждение:
при вызове
удалённой
процедуры
с помощью
данной
функции
для
передачи
используется
протокол UDP/IP;
ограничения
смотрите в
описании
clntudp_create(). При
использовании
данной
функции вы
не можете
управлять
задержкой
или
аутентификацией.
enum clnt_stat clnt_broadcast(unsigned long prognum,
unsigned long versnum, unsigned long procnum,
xdrproc_t inproc, char *in,
xdrproc_t outproc, char *out,
resultproc_t eachresult);
- Подобна callrpc(),
только
сообщение
посылается
как
широковещательное
во все
локально
подключённые
сети.
Каждый раз
при
получении
ответа эта
функция
вызывает
eachresult()
следующего
вида:
-
eachresult(char *out, struct sockaddr_in *addr);
- где out — тот
же самый
параметр
out,
переданный
в clnt_broadcast(), за
исключением
того, что
результат
удалённой
процедуры
сразу же
декодируется;
addr
указывает
на адрес
машины,
которая
послала
результат.
Если eachresult()
возвращает
0, то clnt_broadcast()
продолжит
ждать
ответы; в
противном
случае она
возвращает
соответствующий
статус.
- Предупреждение:
размер
широковещательных
сокетов
ограничен
максимальной
единицей
передачи
данных
подключения.
Для ethernet это
значение
равно 1500
байтам.
enum clnt_stat clnt_call(CLIENT *clnt, unsigned long procnum,
xdrproc_t inproc, char *in,
xdrproc_t outproc, char *out,
struct timeval tout);
- Макрос,
который
вызывает
удалённую
процедуру
procnum,
связанную
с
клиентским
описателем
clnt,
полученным
от функции
создания
клиента RPC,
такой как
clnt_create().
Параметр in
— адрес
аргументов
процедуры,
а out — адрес,
по
которому
размещается
результат;
inproc
используется
для
кодирования
параметров
процедуры,
а outproc
используется
для
декодирования
её
результатов;
tout —
допустимое
время
ожидания
результатов.
clnt_destroy(CLIENT *clnt);
- Макрос,
который
уничтожает
клиентский
описатель
RPC.
Уничтожение,
обычно,
затрагивает
скрытые
структуры
данных,
включая
сам clnt.
Работа с clnt
после
вызова clnt_destroy()
не описана.
Если
библиотека
RPC
открывала
связанный
сокет, он
также
будет
закрыт. В
противном
случае
сокет
останется
открытым.
CLIENT *clnt_create(const char *host, unsigned long prog,
unsigned long vers, const char *proto);
- Generic client creation routine. host identifies the name of the
remote host where the server is located. proto indicates which kind
of transport protocol to use. The currently supported values for this
field are “udp” and “tcp”. Default timeouts
are set, but can be modified using clnt_control().
- Предупреждение:
использование
UDP имеет
недостатки.
Так как в
сообщениях
RPC на основе UDP
может быть
только 8 КБ
закодированных
данных,
этот
протокол
не может
быть
использован
для
процедур с
большим
количеством
параметров
или
которые
возвращают
результат
большого
размера.
bool_t clnt_control(CLIENT *cl, int req, char *info);
- Макрос,
используемый
для
изменения
или
получения
различной
информации
о
клиентском
объекте. В
req
указывается
тип
операции, а
в info —
указатель
на
информацию.
Для UDP и TCP
поддерживаются
следующие
значения
req и их типы
параметров:
-
// назначить общее время ожидания
CLSET_TIMEOUT struct timeval
// получить общее время ожидания
CLGET_TIMEOUT struct timeval
- Замечание:
если вы
установили
время
ожидания с
помощью
clnt_control(), то
параметр
времени
ожидания,
передаваемый
clnt_call(), будет
игнорироваться
во всех
будущих
вызовах.
-
CLGET_SERVER_ADDR struct sockaddr_in
// get server's address
- Следующие
операции
действительны
только для
UDP:
-
// назначить повторное время ожидания
CLSET_RETRY_TIMEOUT struct timeval
// получить повторное время ожидания
CLGET_RETRY_TIMEOUT struct timeval
- Повторное
время — это
время, в
течение
которого
«UDP RPC» ждёт
ответа от
сервера
перед
повторной
отправкой
запроса.
clnt_freeres(CLIENT * clnt, xdrproc_t outproc, char *out);
- Макрос,
который
освобождает
любые
данные,
размещаемые
системой RPC/XDR,
когда она
декодирует
результаты
вызова RPC.
Параметр
out — адрес
результатов,
а outproc —
функция XDR,
описывающая
результаты.
Эта
функция
возвращает
1, если
результаты
были
успешно
освобождены
и 0 в
противном
случае.
void clnt_geterr(CLIENT *clnt, struct rpc_err *errp);
- Макрос,
который
копирует
структуру
ошибки
клиентского
описателя
в
структуру
по адресу
errp.
void clnt_pcreateerror(const char *s);
- Выводит в
стандартный
поток
ошибок
сообщение,
описывающее
почему
клиентский
описатель
RPC не
удалось
создать. В
начало
сообщения
добавляется
строка s и
знак
двоеточия.
Используется
при
ошибках в
функциях
clnt_create(), clntraw_create(), clnttcp_create()
или clntudp_create().
void clnt_perrno(enum clnt_stat stat);
- Выводит в
стандартный
поток
ошибок
сообщение
согласно
условию,
указанному
в stat.
Используется
после callrpc().
clnt_perror(CLIENT *clnt, const char *s);
- Выводит в
стандартный
поток
ошибок
сообщение,
описывающее
почему
вызов RPC
завершился
с ошибкой.
Значение
clnt —
описатель,
использовавшийся
при вызове.
В начало
сообщения
добавляется
строка s и
знак
двоеточия.
Используется
после clnt_call().
char *clnt_spcreateerror(const char *s);
- Похожа на
clnt_pcreateerror(), но
возвращает
строку
вместо
вывода в
стандартный
поток
ошибок.
- Дефекты:
возвращается
указатель
на
статические
данные,
которые
переписываются
при каждом
вызове.
char *clnt_sperrno(enum clnt_stat stat);
- Получает
те же
аргументы,
что и clnt_perrno(), но
вместо
отправки в
стандартный
поток
ошибок
сообщения,
которое
показывает
почему
вызов RPC
завершился
с ошибкой,
возвращает
указатель
на строку с
сообщением.
Строка
заканчивается
символом
NEWLINE.
- Функция
clnt_sperrno()
используется
вместо clnt_perrno(),
если
программа
не имеет
стандартного
потока
ошибок (для
программ,
запущенных
как
сервер),
или если
программист
не хочет
выводить
сообщения
с помощью
printf(3), или
если
формат
сообщения
отличается
от формата,
поддерживаемого
clnt_perrno().
Замечание:
в отличие
от clnt_sperror() и
clnt_spcreateerror(), clnt_sperrno()
возвращает
указатель
на
статические
данные, но
результат
не будет
переписан
при каждом
вызове.
char *clnt_sperror(CLIENT *rpch, const char *s);
- Похожа на
clnt_perror(), но
(подобно
clnt_sperrno())
возвращает
строку
вместо
вывода
сообщения
в
стандартный
поток
ошибок.
- Дефекты:
возвращается
указатель
на
статические
данные,
которые
переписываются
при каждом
вызове.
CLIENT *clntraw_create(unsigned long prognum, unsigned long versnum);
- Эта
функция
создаёт
игрушечного
клиента RPC
для
удалённой
программы
prognum версии
versnum.
Протокол,
используемый
для
пересылки
сообщения
службе, на
самом деле
является
буфером
внутри
адресного
пространства
процесса,
поэтому
соответствующий
сервер RPC
должен
находиться
в том же
адресном
пространстве;
смотрите
svcraw_create(). Он
позволяет
имитировать
RPC и
временные
задержки
без
какого-либо
участия
ядра. При
ошибке эта
функция
возвращает
NULL..
CLIENT *clnttcp_create(struct sockaddr_in *addr,
unsigned long prognum, unsigned long versnum,
int *sockp, unsigned int sendsz, unsigned int recvsz);
- Эта
функция
создаёт
клиента RPC
для
удалённой
программы
prognum, версии
versnum; для
передачи
клиент
использует
протокол TCP/IP.
Удалённая
программа
расположена
по
интернет-адресу
*addr. Если
значение
addr->sin_port равно 0,
тогда ему
назначается
реальный
порт,
который
прослушивается
удалённой
программой
(эта
информация
запрашивается
у
удалённой
службы portmap).
Параметр
sockp — сокет;
если его
значение
равно RPC_ANYSOCK,
тогда эта
функция
открывает
новый
сокет и
изменяет
sockp. Так как в
RPC на основе TCP
используется
буферизация
ввода-вывода,
пользователь
может
задать
размер
посылаемых
и
получаемых
буферов с
помощью
параметров
sendsz и recvsz; при
значении 0
выбираются
подходящие
величины
по
умолчанию.
При ошибке
эта
функция
возвращает
NULL.
CLIENT *clntudp_create(struct sockaddr_in *addr,
unsigned long prognum, unsigned long versnum,
struct timeval wait, int *sockp);
- Эта
функция
создаёт
клиента RPC
для
удалённой
программы
prognum версии
versnum; для
передачи
клиент
использует
протокол UDP/IP.
Удалённая
программа
расположена
по
интернет-адресу
*addr. Если addr->sin_port
равно 0,
тогда ему
назначается
реальный
порт,
который
прослушивается
удалённой
программой
(эта
информация
запрашивается
у
удалённой
службы portmap).
Параметр
sockp — сокет;
если его
значение
равно RPC_ANYSOCK,
тогда эта
функция
открывает
новый
сокет и
изменяет
sockp.
Протокол UDP
повторяет
отправку
сообщения
через
интервал,
указанный
в
параметре
wait, пока не
будет
получен
ответ или
не истечёт
время
ожидания.
Полное
время
ожидания
вызова
определяется
clnt_call().
- Предупреждение:
так как в
сообщениях
RPC на основе UDP
может быть
только 8 КБ
закодированных
данных,
этот
протокол
не может
быть
использован
для
процедур с
большим
количеством
параметров
или
которые
возвращают
результат
большого
размера.
CLIENT *clntudp_bufcreate(struct sockaddr_in *addr,
unsigned long prognum, unsigned long versnum,
struct timeval wait, int *sockp,
unsigned int sendsize, unsigned int recosize);
- Эта
функция
создаёт
клиента RPC
для
удалённой
программы
prognum версии
versnum; для
передачи
клиент
использует
протокол UDP/IP.
Удалённая
программа
расположена
по
интернет-адресу
*addr. Если addr->sin_port
равно 0,
тогда ему
назначается
реальный
порт,
который
прослушивается
удалённой
программой
(эта
информация
запрашивается
у
удалённой
службы portmap).
Параметр
sockp — сокет;
если его
значение
равно RPC_ANYSOCK,
тогда эта
функция
открывает
новый
сокет и
изменяет
sockp.
Протокол UDP
повторяет
отправку
через
интервал,
указанный
в
параметре
wait, пока не
будет
получен
ответ или
не истечёт
время
ожидания.
Полное
время
ожидания
вызова
определяется
clnt_call().
- Эта
функция
позволяет
пользователям
задать
максимальный
размер
пакета для
отправки и
принятия
сообщений
RPC через UDP.
void get_myaddress(struct sockaddr_in *addr);
- Заполнить
IP-адрес
машины в *addr,
не
используя
библиотечные
функции,
которые
работают с
/etc/hosts. Номер
порта
всегда
устанавливается
равным
htons(PMAPPORT).
struct pmaplist *pmap_getmaps(struct sockaddr_in *addr);
- A user interface to the portmap service, which returns a list of
the current RPC program-to-port mappings on the host located at IP address
*addr. This routine can return NULL. The command
rpcinfo -p uses this routine.
unsigned short pmap_getport(struct sockaddr_in *addr,
unsigned long prognum, unsigned long versnum,
unsigned int protocol);
- Пользовательский
интерфейс
службы portmap,
который
возвращает
номер
порта, на
котором
ожидает
подключения
служба,
поддерживающая
программный
номер prognum
версии versnum, и
отвечает
по
протоколу
передачи,
связанному
с protocol.
Обычно,
значение
protocol равно
IPPROTO_UDP или IPPROTO_TCP.
Возвращаемое
значение 0
означает,
что
соответствия
не
существует
или что RPC
системы не
может
соединиться
с
удалённой
службой portmap.
В
последнем
случае
глобальная
переменная
rpc_createerr
содержит
состояние
RPC.
enum clnt_stat pmap_rmtcall(struct sockaddr_in *addr,
unsigned long prognum, unsigned long versnum,
unsigned long procnum,
xdrproc_t inproc, char *in,
xdrproc_t outproc, char *out,
struct timeval tout, unsigned long *portp);
- A user interface to the portmap service, which instructs
portmap on the host at IP address *addr to make an RPC call
on your behalf to a procedure on that host. The parameter *portp
will be modified to the program's port number if the procedure succeeds.
The definitions of other parameters are discussed in callrpc() and
clnt_call(). This procedure should be used for a
“ping” and nothing else. See also
clnt_broadcast().
bool_t pmap_set(unsigned long prognum, unsigned long versnum,
int protocol, unsigned short port);
- Пользовательский
интерфейс
службы portmap,
который
устанавливает
соответствие
между
[prognum,versnum,protocol] и port
на машине с
службой portmap.
Обычно,
значение
protocol равно
IPPROTO_UDP или IPPROTO_TCP.
При
успешном
выполнении
эта
функция
возвращает
1 и 0 в
противном
случае.
Автоматически
выполняется
из svc_register().
bool_t pmap_unset(unsigned long prognum, unsigned long versnum);
- Пользовательский
интерфейс
службы portmap,
который
уничтожает
все
соответствия
между
[prognum,versnum,*] и ports
на машине с
службой portmap.
При
успешном
выполнении
эта
функция
возвращает
1 и 0 в
противном
случае.
int registerrpc(unsigned long prognum, unsigned long versnum,
unsigned long procnum, char *(*procname)(char *),
xdrproc_t inproc, xdrproc_t outproc);
- Регистрирует
процедуру
procname в пакете
служб RPC.
Если
запрос
приходит
программе
prognum версии
versnum и
процедуре
procnum, то procname
вызывается
с
указателем
на эти
параметры;
procname должна
возвращать
указатель
на эти
статические
результаты;
inproc
используется
для
декодирования
параметров,
а outproc — для
кодирования
результатов.
При
успешной
регистрации
эта
функция
возвращает
0 и -1 в
противном
случае.
- Предупреждение:
удалённые
процедуры,
зарегистрированные
таким
способом,
доступны
по
протоколу
UDP/IP;
информацию
об
ограничениях
смотрите в
svcudp_create().
struct rpc_createerr rpc_createerr;
- Глобальная
переменная,
значение
которой
устанавливается
любой
функцией
создания
клиента RPC
при ошибке.
Используйте
функцию
clnt_pcreateerror() для
вывода
сообщения
о причине
ошибки.
void svc_destroy(SVCXPRT *xprt);
- Макрос,
который
уничтожает
описатель
протокола
службы RPC xprt.
Уничтожение,
обычно,
освобождает
скрытые
структуры
данных,
включая
сам xprt.
Работа с xprt
после
вызова
этой
функции не
описана.
fd_set svc_fdset;
- Глобальная
переменная,
отражающая
битовую
маску
читаемого
файлового
дескриптора
службы RPC;
она
подходит в
качестве
параметра
для
системного
вызова select(2).
Полезна
только,
если
реализация
службы
использует
собственный
обработчик
асинхронных
событий, а
не вызова
svc_run(). Эта
переменная
доступна
только для
чтения (не
передавайте
её адрес в
select(2)!), также
она может
измениться
после
вызова svc_getreqset()
или
функций
создания.
int svc_fds;
- Подобна svc_fdset,
но
ограничена
32
файловыми
дескрипторами.
Устарела,
используйте
svc_fdset.
svc_freeargs(SVCXPRT *xprt, xdrproc_t inproc, char *in);
- Макрос,
который
освобождает
любые
данные,
выделенные
системой RPC/XDR
при
декодировании
аргументов
процедуры
службы с
помощью
svc_getargs(). Эта
функция
возвращает
1, если
результаты
были
успешно
освобождены,
и 0 в
противном
случае.
svc_getargs(SVCXPRT *xprt, xdrproc_t inproc, char *in);
- Макрос,
декодирующий
параметры
запроса RPC,
связанного
с
описателем
протокола
службы RPC xprt.
Параметр in
— адрес, по
которому
будут
размещены
аргументы;
inproc —
функция XDR,
использующаяся
для
декодирования
аргументов.
При
успешном
декодировании
функция
возвращает
1 и 0 в
противном
случае.
struct sockaddr_in *svc_getcaller(SVCXPRT *xprt);
- Правильный
способ
получения
сетевого
адреса
вызвавшего
процедуру,
связанную
с
описателем
протокола
службы RPC xprt.
void svc_getreqset(fd_set *rdfds);
- Функция
представляет
интерес,
только
если
реализация
службы не
вызывает
функцию svc_run(),
а
реализует
собственную
асинхронную
обработку
событий.
Вызывается,
когда
системный
вызов select(2)
определил,
что
поступил
запрос RPC в
какой-либо
сокет RPC; rdfds —
битовая
маска
читаемого
файлового
дескриптора.
Функция
завершается
после
обработки
всех
сокетов,
связанных
со
значением
rdfds.
void svc_getreq(int rdfds);
- Подобна
svc_getreqset(), но
ограничена
32
файловыми
дескрипторами.
Устарела,
используйте
svc_getreqset().
bool_t svc_register(SVCXPRT *xprt, unsigned long prognum,
unsigned long versnum,
void (*dispatch)(struct svc_req *, SVCXPRT *),
unsigned long protocol);
- Связывает
prognum и versnum с
функцией
распределения
служб dispatch.
Если
значение
protocol равно 0,
то служба
не
регистрируется
службой portmap.
Если
значение
protocol не равно
0, тогда
соответствие
[prognum,versnum,protocol] и
xprt->xp_port
устанавливается
локальной
службой portmap
(обычно,
значение
protocol равно 0,
IPPROTO_UDP или IPPROTO_TCP).
Функция dispatch
имеет
следующий
вид:
-
dispatch(struct svc_req *request, SVCXPRT *xprt);
- При
успешном
выполнении
функция
svc_register()
возвращает
1 и 0 в
противном
случае.
void svc_run(void);
- Эта
функция не
возвращает
управление.
Она ждёт
поступления
запросов RPC
и при их
появлении
вызывает
соответствующую
процедуру
службы с
помощью
svc_getreq(). Обычно,
эта
функция
ждёт
возврата
из
системного
вызова select(2).
bool_t svc_sendreply(SVCXPRT *xprt, xdrproc_t outproc, char *out);
- Вызывается
функцией
распределения
служб RPC для
отправки
результатов
вызову
удалённой
процедуры.
Параметр
xprt —
описатель
протокола
связанного
запроса; outproc
— функция XDR,
которая
используется
для
кодирования
результатов;
out — адрес,
по
которому
находятся
результаты.
При
успешном
выполнении
эта
функция
возвращает
1 и 0 в
противном
случае.
void svc_unregister(unsigned long prognum, unsigned long versnum);
- Удаляет
все
сопоставления
[prognum,versnum]
функциям
распределения
и [prognum,versnum,*]
номеру
порта.
void svcerr_auth(SVCXPRT *xprt, enum auth_stat why);
- Вызывается
функцией
распределения
служб,
которая
отклоняет
выполнение
вызова
удалённой
процедуры
из ошибки
аутентификации.
void svcerr_decode(SVCXPRT *xprt);
- Вызывается
функцией
распределения
служб, если
невозможно
декодировать
её
параметры.
Смотрите
также svc_getargs().
void svcerr_noproc(SVCXPRT *xprt);
- Вызывается
функцией
распределения
служб, если
не
реализован
номер
процедуры,
указанный
в
полученном
запросе.
void svcerr_noprog(SVCXPRT *xprt);
- Вызывается,
когда
желаемая
программа
не
зарегистрирована
в пакете RPC.
Обычно, для
реализации
службы эта
функция не
требуется.
void svcerr_progvers(SVCXPRT *xprt, unsigned long low_vers,
unsigned long high_vers);
- Вызывается,
когда
желаемая
версия
программы
не
зарегистрирована
в пакете RPC.
Обычно, для
реализации
службы эта
функция не
требуется.
void svcerr_systemerr(SVCXPRT *xprt);
- Вызывается
функцией
распределения
служб при
обнаружении
системной
ошибки, не
относящейся
к какому-то
конкретному
протоколу.
Например,
служба
может
вызвать
эту
функцию,
если не
удалось
выделить
память.
void svcerr_weakauth(SVCXPRT *xprt);
- Вызывается
функцией
распределения
служб для
отклонения
вызова
удалённой
процедуры
из
недостатка
параметров
аутентификации.
Функция
вызывает
svcerr_auth(xprt, AUTH_TOOWEAK).
SVCXPRT *svcfd_create(int fd, unsigned int sendsize,
unsigned int recvsize);
- Создаёт
службу
поверх
любого
открытого
файлового
дескриптора.
Обычно,
этот
файловый
дескриптор
является
подключённым
сокетом
для
поточного
протокола,
например TCP.
В sendsize и recvsize
указываются
размеры
буферов
отправки и
приёма.
Если эти
значения
равны нулю,
то
выбирается
приемлемое
значение
по
умолчанию.
SVCXPRT *svcraw_create(void);
- Эта
функция
создаёт
игрушечный
протокол
службы RPC и
возвращает
указатель
на него. В
действительности
протокол
представляет
собой
буфер
внутри
адресного
пространства
процесса,
поэтому
соответствующие
клиенты RPC
должны
находиться
в том же
адресном
пространстве;
смотрите
clntraw_create(). Эта
функция
позволяет
имитировать
RPC и
создавать
дополнительные
нагрузки
на RPC (как,
например,
время
пересылки
туда и
обратно)
без
какого-либо
вмешательства
ядра. При
ошибке
функция
возвращает
NULL.
SVCXPRT *svctcp_create(int sock, unsigned int send_buf_size,
unsigned int recv_buf_size);
- Эта
функция
создаёт
протокол
службы RPC на
основе TCP/IP и
возвращает
указатель
на него.
Протокол
связывается
с сокетом
sock,
значение
которого
может быть
равно RPC_ANYSOCK; в
этом
случае
создаётся
новый
сокет. Если
сокет не
привязан к
локальному
порту TCP, то
эта
функция
привязывает
его к
произвольному
порту. При
завершении
xprt->xp_sock
содержит
дескриптор
сокета
протокола,
а xprt->xp_port —
номер
порта
протокола.
При ошибке
эта
функция
возвращает
NULL. Так как в RPC
на основе TCP
используется
буферизация
ввода-вывода,
пользователи
могут
задавать
размер
буферов;
при
нулевом
значении
выбирается
подходящий
размер по
умолчанию.
SVCXPRT *svcudp_bufcreate(int sock, unsigned int sendsize,
unsigned int recosize);
- Эта
функция
создаёт
протокол
службы RPC на
основе UDP/IP и
возвращает
указатель
на него.
Протокол
связывается
с сокетом
sock,
значение
которого
может быть
равно RPC_ANYSOCK; в
этом
случае
создаётся
новый
сокет. Если
сокет не
привязан к
локальному
порту UDP, то
эта
функция
привязывает
его к
произвольному
порту. При
завершении
xprt->xp_sock
содержит
дескриптор
сокета
протокола,
а xprt->xp_port —
номер
порта
протокола.
При ошибке
эта
функция
возвращает
NULL.
- Эта
функция
позволяет
пользователям
задать
максимальный
размер
пакета для
отправки и
принятия
сообщений
RPC через UDP.
SVCXPRT *svcudp_create(int sock);
- Этот вызов
аналогичен
svcudp_bufcreate(sock,SZ,SZ) для
некоторого
размера SZ
по
умолчанию.
bool_t xdr_accepted_reply(XDR *xdrs, struct accepted_reply *ar);
- Используется
для
кодирования
ответных
сообщений
RPC. Эта
функция
полезна
для
пользователей,
которые
хотят
генерировать
RPC-подобные
сообщения
без
использования
пакета RPC.
bool_t xdr_authunix_parms(XDR *xdrs, struct authunix_parms *aupp);
- Используется
для
описания
информации
(credentials) UNIX. Эта
функция
полезна
для
пользователей,
которые
хотят
генерировать
такую
информацию
без
использования
пакета
аутентификации
RPC.
void xdr_callhdr(XDR *xdrs, struct rpc_msg *chdr);
- Используется
для
описания
заголовка
сообщений
вызовов RPC.
Эта
функция
полезна
для
пользователей,
которые
хотят
генерировать
RPC-подобные
сообщения
без
использования
пакета RPC.
bool_t xdr_callmsg(XDR *xdrs, struct rpc_msg *cmsg);
- Используется
для
описания
сообщений
вызовов RPC.
Эта
функция
полезна
для
пользователей,
которые
хотят
генерировать
RPC-подобные
сообщения
без
использования
пакета RPC.
bool_t xdr_opaque_auth(XDR *xdrs, struct opaque_auth *ap);
- Используется
для
описания
информационных
сообщений
аутентификации
RPC. Эта
функция
полезна
для
пользователей,
которые
хотят
генерировать
RPC-подобные
сообщения
без
использования
пакета RPC.
bool_t xdr_pmap(XDR *xdrs, struct pmap *regs);
- Используется
для
описания
параметров
различных
функций portmap
извне. Эта
функция
полезна
для
пользователей,
которые
хотят
генерировать
такие
параметры
без
использования
интерфейса
pmap.
bool_t xdr_pmaplist(XDR *xdrs, struct pmaplist **rp);
- Используется
для
описания
списка
соответствия
портов
извне. Эта
функция
полезна
для
пользователей,
которые
хотят
генерировать
такие
параметры
без
использования
интерфейса
pmap.
bool_t xdr_rejected_reply(XDR *xdrs, struct rejected_reply *rr);
- Используется
для
описания
ответных
сообщений
RPC. Эта
функция
полезна
для
пользователей,
которые
хотят
генерировать
RPC-подобные
сообщения
без
использования
пакета RPC.
bool_t xdr_replymsg(XDR *xdrs, struct rpc_msg *rmsg);
- Используется
для
описания
ответных
сообщений
RPC. Эта
функция
полезна
для
пользователей,
которые
хотят
генерировать
RPC-подобные
сообщения
без
использования
пакета RPC.
void xprt_register(SVCXPRT *xprt);
- После
создания
описателей
протокола
службы RPC
они должны
самостоятельно
зарегистрироваться
в пакетом
служб RPC. Эта
функция
изменяет
глобальную
переменную
svc_fds. Обычно,
для
реализации
служб эта
функция не
требуется.
void xprt_unregister(SVCXPRT *xprt);
- Перед
уничтожением
описателя
протокола
службы RPC он
должен
самостоятельно
отменить
регистрацию
в пакете
службы RPC.
Эта
функция
изменяет
глобальную
переменную
svc_fds. Обычно,
для
реализации
служб эта
функция не
требуется.