xdr_mem.c:没有这样的文件或目录

xdr_mem.c:没有这样的文件或目录,c,sockets,rpc,xdr,C,Sockets,Rpc,Xdr,我编写了一个C服务器,它应该使用缓冲区范例,通过XDR库向客户机发送它请求的文件。该程序使用自定义结构 enum tagtype { GET = 0, OK = 1, QUIT = 2, ERR = 3 }; struct file { opaque contents<>; unsigned int last_mod_time; }; union message switch (tagtype tag) { case GET:

我编写了一个C服务器,它应该使用缓冲区范例,通过XDR库向客户机发送它请求的文件。该程序使用自定义结构

enum tagtype {
    GET = 0,
    OK = 1,
    QUIT = 2,
    ERR = 3
};
struct file {
    opaque contents<>;
    unsigned int last_mod_time;
};
union message switch (tagtype tag) {
    case GET:
    string filename<256>;
    case OK:
    struct file fdata;
    case QUIT:
    void;
    case ERR:
    void;
};
我用GDB检查了程序,得到了这个回溯

(gdb) backtrace
#0  xdrmem_putlong (xdrs=0x7fffffffd050, lp=0x7fffffffcf58)
at xdr_mem.c:124
#1  0x00007ffff7b4d99c in __GI_xdr_enum (xdrs=<optimized out>, 
ep=0x7fffffffd000) at xdr.c:500
#2  0x000055555555617e in xdr_tagtype (xdrs=0x7fffffffd050, 
objp=0x7fffffffd000) at xdr_file.c:13
#3  0x0000555555556214 in xdr_message (xdrs=0x7fffffffd050, 
objp=0x7fffffffd000) at xdr_file.c:35
#4  0x0000555555555847 in manage_clixrequest (clisocket_fd=4)
at server3-4.c:273
#5  0x00005555555552a6 in main (argc=3, argv=0x7fffffffdd78)
at server3-4.c:129

我发现我使用了相同的缓冲区来存储文件字节和创建XDR流,这是一个错误。现在没有分段错误,XDR struct
消息已正确填充,但是现在对生成的函数
XDR_bytes()
的调用返回false,编码仍然失败。

很抱歉,您没有提供足够的信息。请发布一个日志,这样我们至少可以尝试跟踪正在发生的事情。我要发布整个服务器功能吗?所以它是可验证的,但我将它保持在最小值,不包括套接字连接部分?你在C库中崩溃了。这很可能意味着您调用的
xdr_message
不正确。在@zwol建议后,我发现我使用了相同的
缓冲区来记忆文件字节并创建xdr流,这是一个错误。现在没有分段错误,XDR struct
消息已正确填充,但现在对生成的函数
XDR_bytes()
的调用返回false,编码仍然失败。我正在更新服务器代码。
Program received signal SIGSEGV, Segmentation fault.
xdrmem_putlong (xdrs=0x7fffffffd050, lp=0x7fffffffcf58) at xdr_mem.c:124
124 xdr_mem.c: No such file or directory.
(gdb) backtrace
#0  xdrmem_putlong (xdrs=0x7fffffffd050, lp=0x7fffffffcf58)
at xdr_mem.c:124
#1  0x00007ffff7b4d99c in __GI_xdr_enum (xdrs=<optimized out>, 
ep=0x7fffffffd000) at xdr.c:500
#2  0x000055555555617e in xdr_tagtype (xdrs=0x7fffffffd050, 
objp=0x7fffffffd000) at xdr_file.c:13
#3  0x0000555555556214 in xdr_message (xdrs=0x7fffffffd050, 
objp=0x7fffffffd000) at xdr_file.c:35
#4  0x0000555555555847 in manage_clixrequest (clisocket_fd=4)
at server3-4.c:273
#5  0x00005555555552a6 in main (argc=3, argv=0x7fffffffdd78)
at server3-4.c:129
/*
 * Please do not edit this file.
 * It was generated using rpcgen.
 */

#include "xdr_file.h"

bool_t
xdr_tagtype (XDR *xdrs, tagtype *objp)
{
    register int32_t *buf;

     if (!xdr_enum (xdrs, (enum_t *) objp))
         return FALSE;
    return TRUE;
}

bool_t
xdr_file (XDR *xdrs, file *objp)
{
    register int32_t *buf;

     if (!xdr_bytes (xdrs, (char **)&objp->contents.contents_val, (u_int *) &objp->contents.contents_len, ~0))
         return FALSE;
     if (!xdr_u_int (xdrs, &objp->last_mod_time))
         return FALSE;
    return TRUE;
}

bool_t
xdr_message (XDR *xdrs, message *objp)
{
    register int32_t *buf;

     if (!xdr_tagtype (xdrs, &objp->tag))
         return FALSE;
    switch (objp->tag) {
    case GET:
         if (!xdr_string (xdrs, &objp->message_u.filename, 256))
             return FALSE;
        break;
    case OK:
         if (!xdr_file (xdrs, &objp->message_u.fdata))
             return FALSE;
        break;
    case QUIT:
        break;
    case ERR:
        break;
    default:
        return FALSE;
    }
    return TRUE;
}