我正在调试ganglia并通过 UDP channel 使用 XDR 发送数据。
我找到了函数 xdrmem_create ( xdrs, addr, size, op)
的第二个参数奇怪的。
其中参数的语法如下:
XDR *xdrs;
char *addr;
u_int size;
enum xdr_op op;
该函数的引用是here .
如您所见,该函数的第二个参数(xdrs)是一个字符数组。这在神经节的功能之一中类似地声明为 char msgbuf[GANGLIA_MAX_MESSAGE_LEN];
.
将上述函数调用为 xdrmem_create(&x, msgbuf, GANGLIA_MAX_MESSAGE_LEN, XDR_ENCODE);
后在神经节中,通过调用函数 cb->msg
将神经节特定结构 ( xdr_Ganglia_value_msg(&x, &(cb->msg))
) 中的适当数据编码为 XDR 格式。哪里x
是 XDR
变量类型。
之后,要通过UDP channel 发送编码后的数据,函数Ganglia_udp_send_message( udp_send_channels, msgbuf, len);
叫做。
为了了解这个XDR数据是如何发送的,我尝试打印 msgbuf
内容的输出使用fprintf
但它总是不打印任何内容,尽管它是一个字符数组。也可以看出编码数据发送成功。
所以,我的问题是,编码成 XDR 格式的数据是如何通过 UDP channel 发送的?
我粘贴了 ganglia here 的部分代码。您可以从第 131 到 136 行看到供您引用。
最佳答案
消息使用 XDR(一种二进制格式)进行编码。使用的 XDR 库很旧,现代版本的 API 可能会使用 uint8_t 而不是 char。尽管它使用 char,但它是二进制数据 - 即您不能将数据打印为字符串。
如果您想打印此数据,请使用循环将每个字节打印为十六进制,例如通过执行 printf("%02X ", msgbuf[i]);
阅读RFC4506了解 XDR 编码。实际消息以 XDR 语言规范进行描述,并通过代码生成工具(例如 rpcgen 用于 C 代码)运行以生成用于编码/解码的代码。请参阅https://github.com/fastly/ganglia/blob/master/lib/gm_protocol.x用于 Ganglia 定义的消息定义。
关于c - 了解函数 "xdrmem_create"中的第二个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25972851/