gpt4 book ai didi

c - 这个 RPC xdr 副本有意义吗?

转载 作者:太空宇宙 更新时间:2023-11-04 03:43:01 25 4
gpt4 key购买 nike

我有这个来自线路的 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 ) ;

最佳答案

这是最终的解决方案。请注意,这是一个 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 */

关于c - 这个 RPC xdr 副本有意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27000237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com