理解函数“xdrmem_create”中的第二个参数

时间:2014-09-22 11:20:16

标签: c udp ganglia xdr

我正在调试ganglia并通过UDP通道使用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格式,其中{ {1}}是x类型的变量。

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

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

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

1 个答案:

答案 0 :(得分: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