这个 RPC xdr 副本有意义吗?

Posted

技术标签:

【中文标题】这个 RPC xdr 副本有意义吗?【英文标题】:Does this RPC xdr copy make sense? 【发布时间】:2014-11-18 17:23:45 【问题描述】:

我有这个来自网络的 RPC 结构T_Struct。 我想复制它,但我不想编写一个单独的函数来处理其成员的所有结构、分配和数组(尤其是我必须对其他结构的音调做同样的事情。 )

既然我已经有了解码、编码和释放的方法,那么有这样的东西是否有意义:

void copy_T_Struct( T_Struct* destination, T_Struct* source )

   XDR xdr ;

   /* Is there a way I can know the size of the buffer for the struct? */
   char buffer[ 10240 ] ;

   xdrmem_create( &xdr, buffer, sizeof( buffer ), XDR_ENCODE ) ;
   ( *xdr_T_Struct )( &xdr, source ) ; /* serialize to buffer */
   xdr.x_op = XDR_DECODE ;
   memset( destination, 0, sizeof( *destination )) ; /* without it I see segfault */
   ( *xdr_T_Struct )( &xdr, destination ) ; /* serialize back to T_Struct */
   xdr_destroy( &xdr ) ;

我知道最后我也可以拨打xdr_free((xdrproc_t)xdr_T_Struct, (char *)destination ) ;

【问题讨论】:

看起来它可以正常工作。需要添加的是在 XDR_ENCODE-ing 时检查 xdr_T_Struct() 函数调用的输出,并在失败时增加缓冲区大小。 【参考方案1】:

这是最终的解决方案。请注意,这是一个 C 版本。

使用静态可重新分配缓冲区。 下面是我们的例子。

xdr_copy.h

#define XDR_COPY( T, d, s ) xdr_copy_(( xdrproc_t )xdr_##T, ( char* )d, ( const char* )s, sizeof( T ))
extern bool_t xdr_copy( xdrproc_t proc, char* d, const char* s ) ;
extern bool_t xdr_copy_( xdrproc_t proc, char* d, const char* s, const unsigned size ) ;

xdr_copy.c

... /* removing all #includes for clarity */
#define XDR_BUFFER_SIZE   ( 100 * 1024 )
#define XDR_BUFFER_DELTA  ( 10 * 1024 )

static char*    xdr_buffer = NULL ;
static unsigned xdr_buffer_size = 0 ;

static char* xdr_buffer_realloc( const unsigned delta )

   char* rv = realloc( xdr_buffer, xdr_buffer_size + delta ) ;

   if ( rv )
   
      xdr_buffer_size += delta ;
      xdr_buffer = rv ;
   

   return rv ;


static char* get_xdr_buffer()

   if ( !xdr_buffer )
      xdr_buffer = xdr_buffer_realloc( XDR_BUFFER_SIZE ) ;

  return xdr_buffer ;


bool_t xdr_copy( xdrproc_t proc, char* d, const char* s )

   XDR   x ;
   char* buffer = get_xdr_buffer() ;

   while ( buffer )
   
      xdrmem_create( &x, buffer, xdr_buffer_size, XDR_ENCODE ) ;
      if (( *proc )( &x, ( caddr_t* )s ))
      
         xdr_destroy( &x ) ;
         xdrmem_create( &x, buffer, xdr_buffer_size, XDR_DECODE ) ;
         ( *proc )( &x, ( caddr_t* )d ) ;
         break ;
      
      else
      
         buffer = xdr_buffer_realloc( XDR_BUFFER_DELTA ) ;
         xdr_destroy( &x ) ;
      
   

   if ( buffer )
   
      xdr_destroy( &x ) ;
      return 1 ;
   
   else
      return 0 ;


bool_t xdr_copy_( xdrproc_t proc, char* d, const char* s, const unsigned size )

   memset( d, 0, size ) ;
   return xdr_copy( proc, d, s ) ;

示例

MyRPCArgs copy ;

if ( !XDR_COPY( MyRPCArgs, &copy, source_ptr ))
   ... /* report memory allocation issue */

【讨论】:

以上是关于这个 RPC xdr 副本有意义吗?的主要内容,如果未能解决你的问题,请参考以下文章

如果(!这个)返回; 在 C# 中有意义吗?

这个 Python 表达式有意义吗?

Linux RPC中XDR 外部数据编码实例

RPC:当数组太大时,xdr_bytes“无法编码参数”

将 NSString 对象设置为零有意义吗?

使用 OR-Mapper 有意义吗?