2014-09-22 24 views
0

我在调试ganglia,并通过使用XDR通过UDP通道发送数据。 我发现函数xdrmem_create (xdrs, addr, size, op)奇怪的第二个参数。 当自变量的语法给出如下:了解函数“xdrmem_create”中的第二个参数

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))其中xXDR类型的变量编码到XDR格式。

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

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

我粘贴了部分代码从ganglia here。你可以从131行到136行看到供你参考。

+0

这个字符数组是否包含0字节? – mafso 2014-09-22 11:29:32

+0

我试图使用'strlen()'打印'msgbuf'的长度,并且它总是返回零。而'sizeof()'返回8. – Rohit 2014-09-22 11:33:07

回答

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

+0

谢谢@nos。这是有道理的。 :) – Rohit 2014-09-22 11:42:32

相关问题