c - 了解函数 "xdrmem_create"中的第二个参数

标签 c udp ganglia xdr

我正在调试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 格式。哪里xXDR变量类型。

之后,要通过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/

相关文章:

hadoop - Amazon Elastic Mapreduce:引导操作问题?

c - K&R : Exercise 7-1 - How do I invoke this?

c - 下面的代码在 C 语言中是如何计算的?

java - Asynctask等待函数导致错误

java - 将 UDP 从 Java 发送到 Python 不起作用

hadoop - 如何延长神经节?

hadoop - Ganglia 监控 Hadoop 多节点集群

将 elisp unixtime 转换为 js-date 对象

c++ - 使用 OpenMP 并行化此递归的最佳方法

c - RTP 丢包问题(?)