簡體   English   中英

如何通過RPC發送數組?

[英]How do I send an array of over the RPC?

使用libtirpc庫通過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)函數直接使用它們。 但是,用於序列化可變長度數組的xdr_array(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)函數實際上無法將這些參數傳遞給這些函數,因此創建包裝函數似乎是解決該問題的最簡單方法:

// 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_array錯誤有兩個原因。

  1. 它只能處理動態分配的數組。
  2. 您正在嘗試發送一個int*數組,就好像它是一個int數組一樣。

正確的使用方式是這樣的(從IBM竊取並簡化,請參閱鏈接以獲取更完整的處理):

typedef struct xarray
{
        int size;
        int *p_array;
} xarray ;

bool_t xdr_xarray(XDR *xdrs, xarray *p_xarray )
{
    return xdr_array(
                 xdrs,
                 (char**)(&(p_xarray->p_array)),
                 &(p_xarray->size),
                 MAX_INT,
                 sizeof(int),
                 (xdrproc_t)xdr_int)) 
}

請注意以下thinsg:

  1. p_array是指向動態分配數組的指針。
  2. 它是int而不是指針的數組。
  3. 我們將p_array的地址p_arrayxdr_array以便在解碼時它可以分配所需大小的數組並將其分配給p_array

如果需要固定大小的數組,則需要使用xdr_vector

typedef struct xvector
{
        int vector[42];
} xarray ;

bool_t xdr_xvector(XDR *xdrs, xarray *p_xvector )
{
    return xdr_vector(
                 xdrs,
                 (char*)p_xvector->vector,
                 42,
                 sizeof(int),
                 (xdrproc_t)xdr_int)) 
}

注意,您仍然不應在此處使用指針數組。

RPC編譯器會根據您的數據結構自動生成XDR過程,因此請考慮使用其中一種。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM