0

我正在调试神经节,并通过 UDP 通道使用 XDR 发送数据。我发现函数的第二个参数xdrmem_create ( xdrs, addr, size, op)很奇怪。其中参数的语法如下:

XDR *xdrs;
char *addr;
u_int size;
enum xdr_op op;

这个函数的参考在这里

如您所见,该函数的第二个参数(xdrs)是一个字符数组。这同样在神经节的功能之一中声明为char msgbuf[GANGLIA_MAX_MESSAGE_LEN];

在 ganglia 中调用上述函数后,通过调用where是一种变量类型的函数,xdrmem_create(&x, msgbuf, GANGLIA_MAX_MESSAGE_LEN, XDR_ENCODE);将 ganglia 特定结构 ( cb->msg) 中的适当数据编码为 XDR 格式。xdr_Ganglia_value_msg(&x, &(cb->msg))xXDR

稍后,为了通过 UDP 通道发送编码数据,该函数Ganglia_udp_send_message( udp_send_channels, msgbuf, len);被调用。为了了解这个 XDR 数据是如何发送的,我尝试打印msgbufusing的内容的输出,fprintf但它总是不打印任何内容,尽管它是一个字符数组。而且很明显,编码数据发送成功。

所以,我的问题是,编码成 XDR 格式的数据是如何在这里通过 UDP 通道发送的?

我在这里粘贴了来自 ganglia 的部分代码。您可以从第 131 到 136 行看到供您参考。

4

1 回答 1

1

消息使用 XDR(一种二进制格式)进行编码。使用的 XDR 库很旧,API 的现代版本可能会使用 uint8_t 而不是 char。尽管它使用 char,但它是二进制数据 - 即您不能将数据打印为字符串。

如果要打印此数据,请使用循环将每个字节打印为十六进制,例如通过执行printf("%02X ", msgbuf[i]);

阅读RFC4506以了解 XDR 编码。实际消息在 XDR 语言规范中描述,并通过代码生成工具(例如,用于 C 代码的rpcgen)运行以生成用于编码/解码的代码。有关 Ganglia 定义的消息定义,请参阅https://github.com/fastly/ganglia/blob/master/lib/gm_protocol.x

于 2014-09-22T11:32:52.500 回答