libtirpc
라이브러리를 사용하여 RPC를 통해 배열을 보내는 데 약간 어려움이 있습니다.RPC를 통해 배열을 보내려면 어떻게해야합니까?
// Client-side boilerplate
struct timeval tout = { 1, 0 };
int in = 42;
clnt_call (cln, 1, (xdrproc_t)xdr_int, (char*)&in,
(xdrproc_t)xdr_void, NULL, tout);
// Server-side boilerplate
int in;
svc_getargs (xprt, (xdrproc_t)xdr_int, (char*)&in);
assert (in == 42);
xdrproc_t
기능 서명이 bool_t (*xdrproc_t) (XDR *, void *, ...);
입니다 : 클라이언트 - 서버 세션 동안 프리미티브 보내기만큼 간단합니다. xdr_int(3)
, xdr_long(3)
및 기타 프리미티브 시리얼 라이저에는 가변 인수가 없으므로 clnt_call(3)
및 svc_getargs(3)
함수를 사용하여 직접 사용할 수 있습니다.
bool_t xdr_array(XDR *xdrs, char **arrp, unsigned int *sizep,
unsigned int maxsize, unsigned int elsize,
xdrproc_t elproc);
clnt_call(3)
정말 너무 래퍼 함수를 생성하는 기능에 이러한 인수를 전달할 수 없습니다 svc_getargs(3)
기능에 가장 깨끗한 해결책처럼 보였다 : 가변 길이 배열을 직렬화하는 데 사용되는 xdr_array(3)
기능은, 그러나, 더 많은 인수를 문제는 :
// Client-side boilerplate
long a = 1, b = 2;
long * arr[] = { &a, &b };
unsigned int amount = sizeof(arr)/sizeof(long*);
bool_t xdr_array_wrapper (XDR * xdr, void * ptr) {
return xdr_array (xdr, ptr, &amount, amount,
sizeof(long), (xdrproc_t)xdr_long);
}
struct timeval tout = { 1, 0 };
long out;
clnt_call (cln, 1, (xdrproc_t)xdr_array_wrapper,
(char*)arr, (xdrproc_t)xdr_long, (char*)&out, tout);
// Server-side boilerplate
long * arr[2];
unsigned int amount = sizeof(arr)/sizeof(long*);
bool_t xdr_array_wrapper (XDR * xdr, void * ptr) {
return xdr_array (xdr, ptr, &amount, amount,
sizeof(long), (xdrproc_t)xdr_long);
}
svc_getargs (xprt, (xdrproc_t)xdr_array_wrapper, (char*)arr);
long a = *arr[0], b = *arr[1];
그러나, 알려지지 않은 이유로, 어레이 (가변 a
)의 첫 번째 요소가 전송되고, 다른 하나는 쓰레기를 포함한다. 내가 도대체 뭘 잘못하고있는 겁니까?
감사합니다.'xdr_vector (3)'은 제가 필요로하는 것입니다. 'xdr_array (3)'가'SIGSEGV' 시그널을 다른 프로세스에 전송하게 만들었 기 때문에 나는 일련의 포인터를 사용하여 끝내게되었습니다. 이제는 함수가 배열에 대한 이중 포인터를 필요로했기 때문에 그것을 보았습니다. 나는 그것을 제공하지 않았습니다 ('arr'은'& arr'과 정적으로 연상 된 배열을가집니다). 이 링크는 많은 도움이됩니다. 필자는 맨페이지를 중심으로 코드를 작성했습니다.이 코드는 제가 원했던 것보다 간결합니다. – Witiko