xdr_mem.c:没有这样的文件或目录
我编写了一个C服务器,它应该使用缓冲区范例,通过XDR库向客户机发送它请求的文件。该程序使用自定义结构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:
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;
}